簡體   English   中英

如何在Windows應用程序中使線程保持活動狀態C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM