我有一个运行线程的程序。该线程始终执行处理,并使用一些同步队列。
班级快照如下:
public class MyClass:IDisposable
{
private Thread myThread = new Thread(threadFunc);
private volatile bool runThread = true;
public MyClass()
{
myThread.Start();
}
public Dispose()
{
runThread = false;
}
private void threadFunc()
{
try
{
while(runThread){
queue.Take(); //This method blocks the thread if queue is empty. It uses Monitor class
//do some processing
}
}
catch(Exception e){...}
}
private void otherFunc()
{
queue.enqueue(...);//this method is executed by main thread and uses lock while adding element to the queue.
}
}
当我调用Dispose()
方法时,线程存在threadFunc()
方法,但过了一秒钟后,我从这个函数“无法表达表达式......”得到一个execption,好像胎面已经终止做一些工作。也许它刚刚从queue.Take()
阻止发布,并且没有上下文可以运行。我知道我错过了什么......
如何解决此类问题并从Dispose方法终止线程。
非常感谢!!!
答案 0 :(得分:2)
使用接受Take
的{{1}}重叠。您可以使用CancellationToken
获取对令牌的引用,该CancellationTokenSource
也具有Cancel
方法,您可以从Dispose
调用以取消阻止Take
方法。您可以阅读更多取消here。
答案 1 :(得分:1)
使用毒丸方法:See this thread