簡體   English   中英

C#如何及時停止線程?

[英]C# how to stop thread in time?

我有一個包含計時器的用戶控件。 當計時器事件運行時,它將調用一些線程。

用戶控制

class MyControl
{
    public Timer iTime
    {
        get;
        set;
    }

    Timer tmr;

    public MyControl
    {
    tmr = new Timer();
    }

    // Some Properties
}
}

主要形式

class MyForm
{
     Thread thd;

     MyControl cls = new MyClass();
     cls.iTime.Tick += new EventHandler(iTime_Tick);

     void iTime_Tick(object sender, EventArgs e)
     {
         thd = new Thread(delegate() { doWork(1); });
         thd.Start();

         thd = new Thread(delegate() { doOtherJob(); });
         thd.Start();
     }

     delegate void notif(int Param1);

     void Job(int Param1)
     {
         if (this.InvokeRequired) 
         {
            notif handler = new notif(notifParam);
            this.Invoke(handler, new object[] { Param1 });
         }
         else
         {
        // Other Process
         }
     }

     private void Logout()
     {
        cls.iTime.Stop();
        cls.iTime.Enabled = false;
        cls.iTime.Tick -= new EventHandler(iTime_Tick);

        thd.abort();
        thd.join();
     }
}

如何終止計時器中的線程? 當我取消訂閱計時器事件甚至關閉窗體時,線程仍然運行。

處置表格對您的線程沒有影響。

您的代碼顯然是不完整的(例如MyControl cls = new MyClass(); doOtherJob但我們不知道doWorkdoOtherJob是什么),但是我懷疑部分問題是您只有一個線程變量。

每次計時器計時時,您都要執行兩次 thd = new Thread 如果你的計時器滴答十倍那么thd在你最近的線程指向,但也有潛在的其他19個線程仍在運行,任何那些可能使您的應用程序正常工作。

可能有幫助的一件事是,在創建的線程.IsBackground顯式設置為true ,因為這將鼓勵它們在UI線程關閉時終止。 但是,我建議以這種方式創建這么多線程可能不是有效的模型,最好將設計修改為僅運行一個或兩個工作線程,而不要踢很多線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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