如何找出物体已处置?

| 我有一个多线程应用程序,并且将“ 0”用作共享对象。每个线程都可以触发它以通知其他线程作业被取消。然后,一个线程进行清理并像这样的“ 0”放置每个对象。然后,如果线程尝试使用它,则会引发异常:   CancellationTokenSource已处置。 在使用之前,我如何找出被丢弃的物体?     
已邀请:
嗯,根据Reflector的说法,
CancellationTokenSource
有一个内部
IsDisposed
方法,它可以告诉您,但是由于它是内部方法,因此您不应该调用它。 无论如何,如果一个线程提取其他线程所依赖的数据结构和对象,则不要这样做。修正您的代码,并在需要的时间内将这些对象保留为活动状态。 换句话说,请等待其他线程完成对
CancellationTokenSource
的处理后再进行处理。     
正确的做法是使某些一次性对象的创建者略微反对Microsoft的“规则”,即对已处置对象执行任何操作都应引发异常,而应遵循更普遍的规则,即异常在无法满足方法的后置条件的任何时候都应该抛出该异常。如果Cancel方法的目的是确保没有人会继续认为该作业处于活动状态,并且甚至在调用Cancel方法之前,每个人都认为该作业已死,则该方法的后置条件将得到满足,无论是否放置物体。 通常,经过精心设计的对象之外的代码无需查询是否已被处置,除非可以断言它已经被处置。取而代之的是,对象本身应提供方法,这些方法在已处置对象上的含义将是明确而明确的。这些方法可能在内部使用IsDisposed标志,但必须使用任何必要的锁定来防止竞争情况。一般来说,模式   如果(!myThing.isDisposed)     myThing.DoSomething(); 表示myThing应该真正支持DoSomethingIfNotDisposed方法(可能称为TryDoSomething)。如果您无法做到这一点,我的倾向可能是编写自己的DoSomethingIfNotDisposed扩展方法并使用Try / Catch扼杀ObjectDisposedException(或该对象将抛出的任何特殊异常)。     
使用前请检查是否丢弃了该物体。 仍然不是最佳的设计模式。但是这是我用来确定对象是否被处置的方法。
if (!object.IsDisposed) object.DoSomething();
要么
public string DoSomething()
{
    if (this.IsDisposed) return null;
}
如果不起作用,则可以尝试添加IsDisposed标志并覆盖dispose方法。并在您自己的代码中将其设置为true。     
继承您的类并添加属性:
class MyCancellationTokenSource: CancellationTokenSource
{
    public bool MyIsDisposed { get; private set; }
    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);
        MyIsDisposed = true;
     }
}
    

要回复问题请先登录注册