タスクの実行中のインスタンスを放棄して新しいインスタンスを開始する必要があるかもしれない状況(正しいか間違っているか)があります。キャンセルはオプションではありません。これは、キャンセルトークンの受け渡しをサポートするために構築するのに多大な労力を要する、ほとんどレガシーコードであるためです。私はこのようなものを意味します
public Task TaskUnderObservation{get; private set;}
public async Task WatchTaskInternal(Func<Task<TResult>> task)
{
try
{
if (TaskUnderObservation != null) //basically if we are re-using this instance of class
ResetCommonTaskState();
TaskUnderObservation = task(); //Task is defined as a class level variable of type Task
LogManager.Instance.Info(this, "Started Task");
await Task;
}
catch (Exception ex)
{
LogManager.Instance.Error(this, "WatchTaskInternal Errored", ex);
}
}
問題は、実行中のTaskUnderObservationに何が起こるかということです。これは、WatchTaskInternalメソッドが次のように繰り返し呼び出されることです。
var x = new TaskWatcherClass();
x.WatchTaskInternal (//some Func);
x.WatchTaskInternal (//some other FUNC);
実行中のタスクは放棄または無視されますか?TaskUnderObservationオブジェクトの結果にバインドされているWPFアプリケーションがある場合、それは最初の呼び出しの結果または最新の呼び出しの結果にバインドされますか?
実行中のコードを放棄することはできません。実行中のコードは複雑である必要があるため、何らかのキャンセルをサポートします。
タスクへの参照を削除するだけでタスクを中止できますが、実行中のコードは最後まで実行されます。
を使用するように誘惑されないでくださいThread.Abort
。それは純粋な悪です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加