CancellationTokenSource.Cancel抛出ObjectDisposedException

Dan*_*mov 3 c# dispose race-condition xamarin.ios cancellationtokensource

我有一个拥有一个班级的班级CancellationTokenSource.

public class GrabboxCell : UICollectionViewCell
{
    CancellationTokenSource _tokenSource = new CancellationTokenSource ();

    // ...
}
Run Code Online (Sandbox Code Playgroud)

我正在使用当前令牌来启动一些长时间运行的操作.

我的目标还需要支持"回收".想想转世.必须取消在前一生中开始的所有长时间运行的操作.

在这种情况下,我调用CancelDispose在源上,并发出一个新的令牌源:

void CancelToken (bool createNew)
{
    _tokenSource.Cancel ();
    _tokenSource.Dispose ();
    _tokenSource = null;

    if (createNew) {
        _tokenSource = new CancellationTokenSource ();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在两个地方调用此方法:当我想要令牌到期时以及何时处理此类.

public override void PrepareForReuse ()
{
    CancelToken (true);
    base.PrepareForReuse ();
}

protected override void Dispose (bool disposing)
{
    CancelToken (false);
    base.Dispose (disposing);
}
Run Code Online (Sandbox Code Playgroud)

有时我从我的方法中接到ObjectDisposedException电话.文件说:_tokenSource.Cancel ()Dispose

所有公共成员和受保护成员CancellationTokenRegistration都是线程安全的,并且可以从多个线程同时使用Dispose,但必须仅在CancellationTokenRegistration已完成所有其他操作时使用.

我不知道此刻该怎么做.包裹CancelToken在一个lock
竞争状况究竟发生在哪里以及如何减轻竞争?

我知道肯定PrepareForReuse一直被称为同一线程,但Dispose可以在一个不同的调用.

如果这是有用的,我运行Mono而不是.NET Framework,但我很确定它们应该具有与取消令牌相同的语义.

Dan*_*mov 5

这并不是很有趣,但是我把它包裹起来Cancel并且Dispose陷入了一个吞噬ObjectDisposedException并且从那时起就没有问题的尝试.