[英]How to keep thread alive throughout the windows application 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 { }
}
您的啟動代碼看起來不錯:我的預后是DaemonEngine.Receiver()
出了點問題,可能拋出了異常,或者函數本身僅處理了一條消息,而……卻沒有看到確切的函數,很難說。
編輯:
為了使我的意見不對:
某些錯誤會導致線程中斷。 異常,邏輯錯誤,我無法告訴您什么,因為線程中沒有發生任何事情的代碼,但是正在發生什么。 與您已經發布的代碼無關,后者只是使線程運行,而不能使其保持運行
另外,從您發布的代碼中,您只是丟棄了一個異常的事實……我手邊沒有鏈接,但是吞噬像這樣的異常是可怕的 。 尤其是在線程內,它們無論如何都不會像正常情況一樣顯示。
也沒有任何形式的循環的跡象,因此可能是我上面的一個或兩個建議引起了問題。
讓線程執行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
}
}
通常,您的DaemonReceiver將具有這樣的代碼
while (!quit)
{
--- do work ---
Thread.Sleep(1000);
}
這將使線程保持活動狀態,直到在主線程中設置quit
全局變量為止。
同樣,非常重要的一點是不要讓異常泄漏到線程之外。 這些異常不會在任何地方報告,並且會導致無提示錯誤,可能是您現在遇到的錯誤。 全力以赴,至少報告一下。
您的線程可能遇到異常,但未被捕獲。 嘗試將try-catch放入正在執行的方法中,看看是否遇到異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.