【问题标题】:Thread Termination suggestion required需要线程终止建议
【发布时间】:2013-10-11 04:20:35
【问题描述】:

我正在使用BackgroundWorker 处理长时间运行的外部操作。但是,用户可以选择取消后台操作。由于我的自定义 BackgroundWorker 支持 Thread.Abort(),所以当用户从主线程触发 Cancel 时,我所做的只是 BackgroundWorker.Abort()

但是线程实际上并没有终止,它仍在完成外部进程。有什么方法可以立即终止线程。

我无法控制外部处理,因此无法为while (checkThreadCancelled){} 之类的方法发送任何标志。

下面是我的伪代码。

有什么帮助吗?

AbortableBackgroundWorker _bgWorker;

void MainThreadFunc()
{
    _bgWorker = new AbortableBackgroundWorker();
    _bgWorker.DoWork += new DoWorkEventHandler(bg_DoWork);
    _bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler
                    ( bg_RunWorkerCompleted );
    _bgWorker.WorkerSupportsCancellation = true; 
    _bgWorker.RunWorkerAsync();
}

void bg_DoWork()
{
    //Call external dll function for processing
}

void bg_RunWorkerCompleted()
{

   //Process completed code
}

void CancelBgProcess()
{
   if(_bgWorker != null)
      _bgWorker.Abort();
}

【问题讨论】:

    标签: c# wpf multithreading


    【解决方案1】:

    Abort 方法依赖于与之合作的工作线程。最终它会导致 CLR 抛出一个异常,指示线程要中止,线程可以随意处理。

    由于您的工作线程正在 DLL 中执行某些操作,因此 CLR 不受控制,因此它没有抛出异常的选项。

    您可以选择使用 Win32 TerminateThread API,但这样做会很严重,并且可能会或可能不会导致进程损坏。 TerminateThread 并不是您真正应该选择的选项。

    由于您无法修改正在调用的库,因此您有两个选择。第一种也是最简单的方法,降低后台线程的优先级并忽略它在取消后继续运行的事实。

    第二个是在单独的进程而不是线程中启动后台操作。此时,如果操作被取消,您可以终止整个过程。如果你走这条路,你将需要选择某种形式的 IPC 来传达库的输入和输出参数。

    【讨论】:

      【解决方案2】:

      您不想使用Thread.Abort,这通常被认为是不好的做法。 SO上有很多问题提供了一些很好的解释。例如:Timeout Pattern - How bad is Thread.Abort really?

      尝试查看TasksCancellationTokens。请参阅此 MSDN 文章:http://msdn.microsoft.com/en-us/library/dd997396.aspx

      【讨论】:

        【解决方案3】:

        试试这个:

        if (_bgWorker.IsBusy)
                    {
                        _bgWorker.WorkerSupportsCancellation = true;
                        //To cancel the Thread if Closing the Application
                        //while the Background Thread Worker is Still running on Background.
                        _bgWorker.CancelAsync();                   
                    }
        

        它将停止当前线程进程并取消该线程上正在进行的操作。 可能对你有帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-18
          • 2011-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-12
          相关资源
          最近更新 更多