を所有するクラスがありCancellationTokenSource
ます。
public class GrabboxCell : UICollectionViewCell
{
CancellationTokenSource _tokenSource = new CancellationTokenSource ();
// ...
}
現在のトークンを使用して、長時間実行される操作を開始しています。
私のオブジェクトも「リサイクル」をサポートする必要があります。生まれ変わりを考えてください。前の人生で開始されたすべての長時間実行操作はキャンセルする必要があります。
この場合、ソースに対して and を呼び出しCancel
、Dispose
新しいトークン ソースを発行します。
void CancelToken (bool createNew)
{
_tokenSource.Cancel ();
_tokenSource.Dispose ();
_tokenSource = null;
if (createNew) {
_tokenSource = new CancellationTokenSource ();
}
}
このメソッドは、トークンを期限切れにするときと、このクラスを破棄するときの 2 つの場所で呼び出します。
public override void PrepareForReuse ()
{
CancelToken (true);
base.PrepareForReuse ();
}
protected override void Dispose (bool disposing)
{
CancelToken (false);
base.Dispose (disposing);
}
メソッドからObjectDisposedException
呼び出したときにエラーが発生することがあります。ドキュメントには次のように記載されています。_tokenSource.Cancel ()
Dispose
のすべてのパブリック メンバーとプロテクト メンバー
CancellationTokenRegistration
はスレッド セーフであり、複数のスレッドから同時に使用できます。例外は、 に対する他のすべての操作が完了Dispose
した場合にのみ使用する必要があります。CancellationTokenRegistration
現時点ではどうすればよいかわかりません。?でラップCancelToken
します。
競合状態は正確にどこで発生し、それを軽減する方法は?lock
常に同じスレッドで呼び出されることPrepareForReuse
は確かですが、別のスレッドで呼び出される可能性があります。Dispose
これが役立つ場合、.NET Framework ではなく Mono を実行していますが、キャンセル トークンに関しては同じセマンティクスを持つ必要があると確信しています。