私は再入国タスクを必要とし、https://blogs.msdn.microsoft.com/lucian/2014/03/03/async-re-entrancy-and-the-patterns-to-deal-with-it/のようなコードを実装する(パターン5)リエントラントパターン5:以前の呼び出しを取り消す
が、CancellationTokenSourceの処分が欠落していない場合、私は思ったんだけど。私の実装は.ContinueWithで追加しています
private Task _fooAsyncTask;
private CancellationTokenSource _fooAsyncCancellation;
public async Task Button1Click()
{
// Assume we're being called on UI thread... if not, the two assignments must be made atomic.
// Note: we factor out "FooHelperAsync" to avoid an await between the two assignments.
// without an intervening await.
_fooAsyncCancellation?.Cancel();
_fooAsyncCancellation = new CancellationTokenSource();
_fooAsyncTask = FooHelperAsync(_fooAsyncCancellation.Token);
await _fooAsyncTask.ContinueWith(task =>
{
_fooAsyncCancellation.Dispose();
_fooAsyncCancellation = null;
});
}
private async Task FooHelperAsync(CancellationToken cancel)
{
try { if (_fooAsyncTask != null) await _fooAsyncTask; }
catch (OperationCanceledException) { }
cancel.ThrowIfCancellationRequested();
await FooAsync(cancel);
}
private async Task FooAsync(CancellationToken cancel)
{
//
}
これは間違いありませんか?
CTSを配置する必要はありません。あなたはそれを処分することができますが、それを処分する価値がある、管理されていないリソースはありません。ちょっと待ってください_fooAsyncTask –
もう一度見た後、CTSを破棄することはお勧めしません。そうすれば、* _fooAsyncCancellation ?Cancel(); * –
@SirRufo "it CTSを処分することはお勧めしません。 " - あなたはそのためにレフェリングをしていますか?私はそのことに関していくつかの「ベストプラクティス」を探していただけです... – Fildor