代码之家  ›  专栏  ›  技术社区  ›  duraz0rz

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

  •  1
  • duraz0rz  · 技术社区  · 16 年前

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

    例子:

    // 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();
    }
    

    理论上,我可以在cancelWatch()函数中包含一个提示符,但是在实现这个类的任何地方都必须这样做。

    2 回复  |  直到 16 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

    我有几个简短的评论:

    1. 避免使用 Thread.Abort() here's why
    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();
    }
    
        2
  •  1
  •   Stephen Cleary    16 年前

    我建议使用 CancellationTokenSource ,它可以处理这种复杂的场景。它是任务并行库的一部分,但实际上不必与 Task 物体;它可以很容易地与旧样式一起使用 Thread 物体。

    任务 对象(通过使用 TaskScheduler.FromCurrentSynchronizationContext ).

    bool cancelled; 字段由 lock Thread.Abort