使用另一个线程停止一个线程的工作

dur*_*0rz 3 c# multithreading

不确定我的标题是否措辞得当,但无论如何:)

我有两个线程:包含需要完成的工作的主线程,以及包含带有进度条和取消按钮的表单的工作线程。在正常代码中,情况正好相反,但在这种情况下我不能这样做。

当用户单击取消按钮时,会显示一条提示,询问他是否真的要取消该工作。问题是工作在主线程上继续进行。我可以让主线程停止工作等,但我希望当他在提示上单击“是”时它停止工作。

例子:

// Main thread work starts here    
    t1 = new Thread(new ThreadStart(progressForm_Start));
    t1.Start();

    // Working
    for (i = 0; i <= 10000; i++)
    {
        semaphore.WaitOne();
        if (pBar.Running)
            bgworker_ProgressChanged(i);
        semaphore.Release();
        if (pBar.IsCancelled) break; 
    }

    t1.Abort(); 
// Main thread work ends here

// Start progress bar form in another thread
void progressForm_Start()
{
    pBar.Status("Starting");
    pBar.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud)

理论上我可以在 cancelWatch() 函数中包含一个提示,但随后我必须在实现此类的所有地方都这样做。

Kir*_*ril 5

我有几个简短的评论:

  1. 避免使用Thread.Abort() 原因如下
  2. 让你的线程成为后台线程:(Thread.IsBackground = true当你的应用程序退出时,这将自动退出线程)。

这里详细讨论了如何安全地停止线程运行:Is it safe to use a boolean flag to stop a thread from running in C#

要停止主线程上的工作,您必须执行以下操作:

boolean volatile isRunning = true;

static void Main(...)
{
    // ...
    // Working
    for (i = 0; i <= 10000; i++)
    {
        semaphore.WaitOne();
        if (!isRunning) break; // exit if not running
        if (pBar.Running)
            bgworker_ProgressChanged(i);
        semaphore.Release();
    }
    //...
    t1.Interrupt();// make the worker thread catch the exception
}
// 
void cancelButton_Click(object sender, EventArgs e)
{
    isRunning = false; // optimistic stop
    semaphore.Release();
}
Run Code Online (Sandbox Code Playgroud)