c#终止线程挂起

时间:2018-04-11 16:45:22

标签: c# multithreading winforms

我已经查看了该主题的所有解决方案,但似乎仍然无法在不使用Thread.Abort()的情况下完成线程的停止。 以下是代码:创建线程的主类代码:

            _pollingThread = new Thread(pollingThread);
            _pollingThread.Start();

以下是主题:

 void _pollingThread()
 {
     while (continuePolling) //initially set to true
     {
          //do some things can take about 200ms to run
     }
 }

我接下来尝试通过将continuePolling设置为false来停止主线程中的线程。

 private void form1_FormClosing(object sender, FormClosingEventArgs e)
 {
     continuePolling = false;
     Thread.Sleep(1000);

     _pollingThread.Join(1000);

    if (_pollingThread.IsAlive) //always alive!
    {
        _pollingThread.Abort;
    }
 }

有人能告诉我我做错了什么吗? 感谢

2 个答案:

答案 0 :(得分:2)

使用中止/中断来停止线程,编程错误。你永远不知道它做了什么以及它没有做什么。 有一个例外(比如终止挂起的第三方代码),即使那时也认为它是邪恶的。您应该使用ManualResetEvent告诉线程终止执行。 ManualResetEvent是线程安全的,效果很好。

以下是一个例子:

public class MyThread
{
    private ManualResetEvent _terminate = new ManualResetEvent(false);
    private Thread _thread;

    private void PollingThread()
    {
        while(!_terminate.WaitOne(0))
        {
            // do your stuff, if you want a pause after each loop,
            // you should change the 0 of waitone. This way the 
            // termination isn't blocked when waiting
        }
    }

    public MyThread()
    {
        _thread = new Thread(PollingThread);
        _thread.Start();
    }

    public void Stop()
    {
        if(_thread != null)
        {
            _terminate.Set();
            _thread.Join();
            _thread = null;
        }
    }
}

答案 1 :(得分:0)

continuePolling必须声明volatile,否则无法保证在任何其他线程中都可以看到一个线程中的修改。

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/volatile

或者,您可以考虑使用System.Timers.Timer之类的内容定期运行轮询操作。