我已经查看了该主题的所有解决方案,但似乎仍然无法在不使用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;
}
}
有人能告诉我我做错了什么吗? 感谢
答案 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
之类的内容定期运行轮询操作。