0

我正在使用受约束的执行区域 (CER) 来保护线程的 while 循环中的代码段:

private static void MyThreadFunc()
{
    try {
        ...
        while (true)
        {
            RuntimeHelpers.PrepareConstrainedRegions();
            try { }
            finally
            {
                // do something not to be aborted
            }
            Thread.Sleep(1);    // allow while loop to be broken out
        }
    }
    catch (ThreadAbortException e)
    {
         // handle the exception 
    }
}

问题是,如果我不在Thread.Sleep(1)while 循环结束时引入语句,则在线程上调用 Thread.Abort() 的任何尝试都会挂起。有没有更好的方法可以在不使用该Thread.Sleep()函数的情况下中止线程?

4

1 回答 1

0

我不知道为什么你需要手动中止线程,因为 CLR 会在它完成后执行它,或者使用Thread.Join等待它终止。但是您可以使用ManualResetEvent优雅地中止它。

通过将while(true)替换为ManualResetEvent,我对代码进行了一些更改

class ThreadManager
{
    private ManualResetEvent shutdown = new ManualResetEvent(false);
    private Thread thread;

    public void start ()
    {
        thread = new Thread(MyThreadFunc);
        thread.Name = "MyThreadFunc";
        thread.IsBackground = true; 
        thread.Start();
    }

    public void Stop ()
    {
        shutdown.Set();
        if (!thread.Join(2000)) //2 sec to stop 
        { 
            thread.Abort();
        }
    }

    void MyThreadFunc ()
    {
        while (!shutdown.WaitOne(0))
        {
            // call with the work you need to do
            try {
                    RuntimeHelpers.PrepareConstrainedRegions();
                    try { }
                    finally
                    {
                        // do something not to be aborted
                    }
                }
                catch (ThreadAbortException e)
                {
                        // handle the exception 
                }
        }
    }
}
于 2016-08-19T19:37:25.997 回答