c# - 持有线程的类的 IDisposable 实现

标签 c# .net multithreading

早上好! 假设我们有以下类:

class MultithreadOperation : IDisposable
{
    private IList<Thread> operationThreads;

    public void StartOperation()
    {
          // Initialize and start threads and put them to operationThreads
    }

    public void StopOperation()
    {
          // Aborts each thread.
    }

    public void Dispose()
    {
          Dispose(true);
          GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
         if (!disposed)
         {
              disposed = true;
              if (disposing)
              {
                    // Release managed resources.
                    #1:
                    StopOperation();
              }
              // Release unmanaged resources.
              #2:
              StopOperation();
         }
    }

    ~MultithreadOperation()
    {
         Dispose(false);
    }
}

实际上,如果实例被释放,我需要停止所有线程。此外,如果实例被垃圾收集,我需要停止所有线程(否则,线程将仍然存在,这对我不利)。 当然,在#1 位置调用 StopOperation() 方法是完全合法的。

我想知道如果我们在 #2 位置调用 StopOperation() 是否有任何陷阱? 据我了解,当 ~MultithreadOperation() 正在执行时,线程列表可能已经被垃圾收集。此外,我看到很多建议避免在 Finalize 实现中引用托管资源的任何代码,尤其是实例字段。

此外,听到有关解决此问题的不同方法会很有趣。 谢谢!

最佳答案

这完全不合适。不太了解细节的类用户会认为调用 Dispose() 会做一些无辜的事情。一点点清理,没什么特别的。她将期望程序处于完全不可预测的状态,线程改变该状态会在随机位置中止而无法恢复状态。

它也是终结器线程上的完整 redrum,如果线程未处于可警报状态,则中止线程可能需要很多秒。 CLR 将在 2 秒后中止终结器线程并终止程序,完全不诊断程序崩溃的真正原因。

关于c# - 持有线程的类的 IDisposable 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3812651/

相关文章:

c# - 对象初始化期间接口(interface)集合成员的奇怪行为

ios - 除非另有说明,否则所有 iOS GameCenter 回调都在主线程上执行吗?

c# - 如何在不使用 Skype API 的情况下读取所有 Skype 联系人和消息?

java - 当发布者线程数远高于消费者数时,Spring Reactor 会受益

c++ - 在基类/派生类中调用 C++ 的纯虚函数

c# - 如何在运行时传递参数?

c# - 为什么我可以在 C# 中像数组一样初始化一个列表?

c# - 动态执行基于 SOAP 的 Web 服务而不生成代理

.net - 翻译 WPF

c# - 在 C# 中使用 p12 证书从 SFTP 下载文件