【发布时间】:2013-02-02 10:58:17
【问题描述】:
我有一个拥有CancellationTokenSource 的班级。
public class GrabboxCell : UICollectionViewCell
{
CancellationTokenSource _tokenSource = new CancellationTokenSource ();
// ...
}
我正在使用当前令牌开始一些长时间运行的操作。
我的对象也需要支持“回收”。想想轮回。必须取消在前一个生命周期中开始的所有长时间运行的操作。
在这种情况下,我在源上调用Cancel 和Dispose,并发出一个新的令牌源:
void CancelToken (bool createNew)
{
_tokenSource.Cancel ();
_tokenSource.Dispose ();
_tokenSource = null;
if (createNew) {
_tokenSource = new CancellationTokenSource ();
}
}
我在两个地方调用这个方法:当我希望令牌过期时和当这个类被释放时。
public override void PrepareForReuse ()
{
CancelToken (true);
base.PrepareForReuse ();
}
protected override void Dispose (bool disposing)
{
CancelToken (false);
base.Dispose (disposing);
}
有时我从我的Dispose 方法调用_tokenSource.Cancel () 时会得到一个ObjectDisposedException。文档说:
CancellationTokenRegistration的所有公共和受保护成员都是线程安全的,并且可以从多个线程同时使用,但Dispose除外,它只能在CancellationTokenRegistration上的所有其他操作完成后使用。
我现在不知道该怎么办。将 CancelToken 包裹在 lock?
竞态条件究竟发生在哪里以及如何缓解?
我确定PrepareForReuse总是在同一个线程上调用,但Dispose 可能在不同线程上调用。
如果这有任何用处,我正在运行 Mono 而不是 .NET Framework,但我很确定它们在取消令牌方面应该具有相同的语义。
【问题讨论】:
-
有趣的是,我刚刚发现了这个:
SafeCancellationTokenSource。 -
I need current token to expire是什么意思? -
@Hamlet:我希望取消
_tokenSource.Token之前返回的令牌。 -
@Hamlet 我编辑了,现在清楚了吗?
标签: c# xamarin.ios dispose race-condition cancellationtokensource