c# - 告诉正在执行循环的线程跳出循环并执行其他操作的正确方法是什么?

标签 c# .net multithreading thread-abort event-wait-handle

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

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
 }

下面的代码有一个缺点,它使用了 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
 }

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

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

最佳答案

您可以使用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
}

(代码未经测试)

关于c# - 告诉正在执行循环的线程跳出循环并执行其他操作的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14528032/

相关文章:

c# - 使用带反射的 XPath 样式查询

java - 为什么垃圾收集器在回收内存之前停止所有线程

c# - 如何处理第三方代码中的死锁

c# - 无法将扩展方法转换为存储表达式

c# - 如何在pcm流(C#)中查找音频功率(db)

java - 对可变对象的 volatile 引用——所有线程都可以看到对象字段的更新

c++ - 当作为 Function 的参数传递给线程时,为什么仿函数的 dtor 调用两次(多次)?

c# - DropDownListForModel 无法添加 HTML 属性

c# - 如何在 JavaScript 中设置属性背后的代码

c# - XNA Texture2D 缓存