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

C#:正确松开螺纹

  •  2
  • core  · 技术社区  · 17 年前

    我应该实现IDisposable并简单地使用它吗?

    public void Dispose()
    {
        this.myThread.Abort();
    }
    

    我读到Abort()是邪恶的。我是否应该让Dispose()设置一个私有bool标志,让线程检查true以退出其循环?

    public void Dispose()
    {
        this.abort = true;
    }
    

    if (this.abort)
    {
        break;
    }
    

    改用BackgroundWorker类?

    3 回复  |  直到 17 年前
        1
  •  4
  •   Scott Wisniewski    17 年前

    我想进一步说明“lc”提供的答案(这在其他方面是很好的)。

    要使用他的方法,还需要将布尔标志标记为“volatile”。这将引入一个“内存屏障”,它将确保每次后台线程读取变量时,它都会从内存(而不是寄存器)中获取它,并且当变量被写入时,数据会在CPU缓存之间传输。

        2
  •  3
  •   lc.    17 年前

    不要使用无限循环,而是使用可以由主类设置为循环条件的布尔标志。完成后,设置标志以便循环可以正常退出。如果你实施 IDisposable

    你可以实现一个可取消的 BackgroundWorker

    如果你真的愿意,你可以给它一个时间窗口,让它在发出信号后自己完成。如果它没有终止,您可以中止线程,就像Windows在关机时所做的那样。

    我之所以相信 Thread.Abort 所谓“恶”,是指它使事物处于一种不确定的状态。但是,与终止整个进程不同的是,其余的线程继续运行并可能遇到问题。

        3
  •  0
  •   McAden    17 年前