2009-06-25 38 views
1

我正在使用線程,它將接收來自 外部應用程序的消息。所以我的線程總是處於活動狀態。如何保持線程在整個Windows應用程序中活着c#

我想讓我的線程運行完整個應用程序,直到 直到應用程序退出。目前我在program.cs中調用我的線程, 這是windows應用程序c#的啓動。請參閱下面的代碼 知道我是如何做到這一點。

當我使用下面的代碼時,線程在 應用程序啓動時啓動...但它會中斷一些如何在線程接收到來自外部應用程序的一條消息之後 。

我希望我對我的問題很清楚。請幫忙。謝謝。


static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     StartThread(); 
     Application.Run(new Screensaver()); 
    } 
    public static void StartThread() 
    { 
      DeamonEngine Deamon = new DeamonEngine(); 
      Thread ThreadReciever = new Thread(Deamon.Receiver); 
      if (!(ThreadReciever.IsAlive)) 
      { 
       ThreadReciever.Start(); 
      } 
     } 
    } 

從評論:

void Receiver() { 
     try { 
      Initiate socket s; 
      Bind Ip address; 
      s.Receiver[bytes]; 
      Access the members of message received in bytes; 
      Assign the members of message to local variable; 
      Read Xml File, get the node values and write to batch file; 
      Execute batch file. 
     } 
     catch { } 
    } 
+0

Karthik,幾次你說有一個循環。你能告訴我們這個循環嗎?我沒看到一個。您發佈的代碼將執行一次,然後線程將終止。 – 2009-07-25 20:47:35

回答

2

使線程執行Receiver方法並不意味着線程將重複執行該方法。

鑑於問題中的處理代碼,Daemon.Receiver需要在循環中執行,以便它可以返回並檢索要處理的下一條消息。它應該是這個樣子:

void Receiver() { 
    while(!done) // without this loop, only one execution will occur 
    { 
     try { 
      // do stuff 
     } 
     catch { 
      // log/handle error 
     } 

     // wait for next message 
    } 
} 
+0

是的。我的Deamon.receiver方法接收消息。它運行一個循環來處理我得到的消息。但一旦它處理了第一條消息,它就會中止。 – Anuya 2009-06-25 05:11:26

2

你的啓動代碼看起來不錯:我的預測是有一個與DaemonEngine.Receiver()不對勁,或許是個例外被拋出,或者功能本身的結構只能處理一條消息......沒有看到確切的功能,很難說。

編輯:

爲了讓我的東西出來的我的意見:

事情錯了要殺死你的線程。例外,邏輯錯誤,我不能告訴你什麼,因爲沒有你的線程中發生的事情的代碼,但有些事情正在發生。這與你已經發布的代碼無關,它只是讓線程運行,而不是讓它保持運行。

此外,從你發佈的代碼中,你只是拋棄了事實上有一個例外。我手邊沒有鏈接,但是吞嚥例外是可怕的。特別是在一個線程內,它們不會像通常那樣正常顯示。

也沒有跡象表明任何形式的循環,所以它可能是我的一個或兩個建議上面,這是造成問題。

+0

我的Deamon.receiver方法在沒有任何異常的情況下接收消息。我很確定,因爲第一條消息的處理工作正常,我也一行一行地調試。 – Anuya 2009-06-25 05:13:13

0

您的線程可能遇到了未捕獲的異常。嘗試在正在執行的方法中添加try-catch,並查看是否收到異常。

+0

我的Deamon.receiver方法在沒有任何異常的情況下拾取消息。我很確定,因爲第一條消息的處理工作正常,我也一行一行地調試。 – Anuya 2009-06-25 05:12:39

2

通常你會DaemonReceiver有這樣

while (!quit) 
{ 
    --- do work --- 
    Thread.Sleep(1000); 
} 

這使得線程活着代碼,直到你在主線程設置quit全局變量。

此外,不要讓異常泄漏出您的線索是非常重要的。這些例外情況不會在任何地方報告,並會導致無聲錯誤,可能是您現在遇到的情況。抓住一切,至少報告一下。

相關問題