c#:如何在dispose()方法中终止后台线程?

时间:2010-11-10 09:20:45

标签: multithreading

我有一个运行线程的程序。该线程始终执行处理,并使用一些同步队列。

班级快照如下:

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方法终止线程。

非常感谢!!!

2 个答案:

答案 0 :(得分:2)

使用接受Take的{​​{1}}重叠。您可以使用CancellationToken获取对令牌的引用,该CancellationTokenSource也具有Cancel方法,您可以从Dispose调用以取消阻止Take方法。您可以阅读更多取消here

答案 1 :(得分:1)

使用毒丸方法:See this thread