什么是告诉正在执行循环的线程突破循环并执行其他操作的正确方法?

Joh*_*ith 5 .net c# multithreading thread-abort event-wait-handle

以下代码的缺点是,在主线程重置waithandle之后,工作线程既不会立即终止也不会执行最终操作.相反,它将继续执行它正在进行的操作,直到它到达循环的下一次迭代,此时它将无限期地被阻塞.

static void Main()
{
 ManualResetEvent m = new ManualResetEvent(true); // or bool b = true
 Thread thread = new Thread(new ThreadStart(delegate()
 {
    while(m.WaitOne()) //or while(b)
    {
        //do something
    }
    //perform final operation and exit
 }));

 thread.Start();

 //do something

 m.Reset(); //or b = false

 //do something else
 }
Run Code Online (Sandbox Code Playgroud)

下面的代码有一个缺点,它使用Abort()方法(有人说它应该不惜一切代价避免),但完全正是我正在寻找的:强制工作线程突破循环主线程告诉它这样做,执行最后一个操作,然后退出.

static void Main()
{
 Thread thread = new Thread(new ThreadStart(delegate()
 {
    try
    {
        while(true)
        {
            //do something
        }
    }
    catch(ThreadAbortException e)
    {
           //perform final operation and exit
    }
 }));

 thread.Start();

 //do something

 thread.Abort();    

 //do something else
 }
Run Code Online (Sandbox Code Playgroud)

既然这两种解决方案都不理想,那么实现我正在寻找的功能的正确方法是什么?

(我更喜欢不涉及.net 4.5任务的解决方案)

Rob*_*obH 1

您可以使用BackgroundWorker

static void Main()
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += worker_DoWork;
    worker.RunWorkerAsync();

    // do something 

    worker.CancelAsync();

    // do something else
}

void worker_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    while(!worker.CancellationPending)
    {
        // do something
    }
    // perform final action
}
Run Code Online (Sandbox Code Playgroud)

(代码未经测试)