Thread.Abort停止所有线程或只是当前。聪明地使用Abort?

时间:2011-04-01 06:39:56

标签: c# multithreading

    RulyCanceler canceler = new RulyCanceler();
    Thread workerThread = new Thread(() =>
    {
        try { Work(canceler, crawler, propertyBag); }
        catch (OperationCanceledException e)
        {
            LogError.WriteError("Working thread canceled!" + Environment.NewLine);
            LogError.WriteError(e);
        }
        catch (Exception e)
        {
            LogError.WriteError(e);
        }
    });
    workerThread.Start();

    bool finished = workerThread.Join(120000);
    if (!finished)
    {
        LogError.WriteError("Aborting thread");
        workerThread.Abort();
    }

我无法弄清楚当Abort正在调用时,我的程序是否会停止所有线程,或者当前线程和程序是否仍在执行。有时程序停止意外,但我不知道abort是否有罪。有人能告诉我吗?

编辑:

我像John建议的那样修改课程

class RulyCanceler
    {    
        readonly object _cancelLocker = new object();
        bool _cancelRequest;

        private bool IsCancellationRequested
        {
            get { lock (_cancelLocker) return _cancelRequest; }
        }

        public void Cancel() { lock (_cancelLocker) _cancelRequest = true; }

        public void ThrowIfCancellationRequested()
        {
            if (IsCancellationRequested) throw new OperationCanceledException();
        }
    }

class Test
{
  static void Main()
  {
    var canceler = new RulyCanceler();
    new Thread (() => {
                        try { Work (canceler); }
                        catch (OperationCanceledException)
                        {
                          Console. WriteLine ("Canceled! ");
                        }
                      }). Start();
    Thread. Sleep (1000);
    canceler. Cancel();               // Safely cancel worker.
  }
  static void Work (RulyCanceler c)
  {
    while (true)
    {
      c. ThrowIfCancellationRequested();
      // . . .
      try      { OtherMethod (c); }
      finally  { /* any required cleanup */ }
    }
  }

2 个答案:

答案 0 :(得分:5)

Thread.Abort只会中止您调用它的线程。但是,这是终止线程的一种非常糟糕的方式 - 你应该以更加可控和合作的方式进行。 Thread.Abort是一种中止当前正在执行的线程的安全方法,但是否则您不知道该线程处于适当的中止位置而不会使应用程序处于不一致状态。您通常应该在整个应用程序停止运行的时候保留它。

答案 1 :(得分:1)

如果您想知道将应用程序关闭的内容,请将事件处理程序附加到AppDomain.UnhandledException事件并记录堆栈跟踪(或设置调试断点)。