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)
我正在使用当前令牌来启动一些长时间运行的操作.
我的目标还需要支持"回收".想想转世.必须取消在前一生中开始的所有长时间运行的操作.
在这种情况下,我调用Cancel并Dispose在源上,并发出一个新的令牌源:
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,但我很确定它们应该具有与取消令牌相同的语义.
| 归档时间: |
|
| 查看次数: |
3101 次 |
| 最近记录: |