【问题标题】:Event after BackgroundWorker thread is abortedBackgroundWorker 线程中止后的事件
【发布时间】:2017-04-29 13:40:30
【问题描述】:

也许我想太多了,但是我有许多线程在执行一个相当长的过程,并且我希望能够在必要时彻底中止它们。这主要是因为我不想在旧线程完成之前启动新线程。有没有办法通过事件或其他方法告诉线程完全中止?或者我不应该担心这个?目前我的中止方法中有如下代码:

    private void AbortProcessing()
    {
        if (!Processing) return;
        StopFlag = true;
        for (int x = 0; x < MaxThreads; x++)
        {
            try
            {
                BW[x].CancelAsync();
            }
            catch { }
            //Processing = false;
        }
        bool aborted = false;
        while (!aborted)
        {
            aborted = true;
            for (int x = 0; x < MaxThreads; x++)
            {
                if (BW[x].IsBusy) aborted = false;
            }
            Thread.Sleep(100);

        }
    }

在发出中止信号后,IsBusy 始终为真,因此这不起作用。有什么建议吗?

【问题讨论】:

  • 是否有任何 BackgroudWorker 工作方法检查是否应该取消操作?
  • CancelAsync() 只是表示线程应该被中止。您实际上是否在后台线程中检查该标志并退出它?这不会自动发生...
  • 这是一个典型的死锁案例,它是通用线程错误之一。 BGW 只能在其 RunWorkerCompleted 事件运行后才能完成。它无法运行,您正在通过循环和休眠来挂起 UI 线程。如果您不描述您认为需要循环的原因,就不可能为您提供更好的解决方案。
  • Idle_Mind,我正在检查并退出 CancellationPending 的处理是否为真。我想我认为当线程在这种情况下完成时会触发其他一些事件或标志。 RunWorkerCompleted 事件似乎没有触发,但我可能错了。我想知道此时我是否可以将 IsBusy 设置为 false。还是有更好的方法?

标签: c# multithreading backgroundworker


【解决方案1】:

试试这个:这个的简单示例

       Thread o;
    private void button1_Click(object sender, EventArgs e)
    {
        ThreadStart starter = ThreaadFunction;
        starter += () => {

            //this is this event you want to do any thing after a threaad finished the job


        };
        o = new Thread(starter) {IsBackground =true };
        o.Start();
    }

    public void ThreaadFunction()
    {
        Thread.Sleep(1000);
        // what you do in thread
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多