まず、お詫び申し上げます。適切な単純なサンプル アプリケーションでこの動作を再現することはできません。この機能は、呼び出しコードのリファクタリングの前に機能していました。
TaskCompletionSource を使用して非同期操作の終了を通知しようとしています (長時間実行されるプロセスが完了するか、タイムアウトが TrySetResult() を使用して完了を通知する場合があります)。
私の問題は、タスクが「WaitingForActivation」から「RanToCompletion」に移行していることがわかっても、await の呼び出しが完了しないことです。
テストとして、タスクの継続を作成し、これが呼び出され、タイマーを追加してタスクの状態を表示しました。
async Task<Foo> WaitForResultOrTimeoutAsync()
{
//... [Create 'pendingReq' with its TaskCompletion property]
TaskCompletionSource<Foo> myCompletion = pendingReq.TaskCompletion;
Task<Foo> theTask = myCompletion.Task;
var taskContinuation = theTask.ContinueWith(resp =>
{
Console.WriteLine("The task completed");
return resp.Result;
});
new Timer(state =>
{
Console.WriteLine("theTask TaskCompletion state is {0}", theTask.Status);
Console.WriteLine("taskContinuation TaskCompletion state is {0}", taskContinuation.Status);
}, null, 0, 1000);
//var result = await theTask;
var result = await taskContinuation;
Console.WriteLine("We're FINISHED"); // NEVER GETS HERE
return result;
}
これにより、次の出力が得られます。
theTask TaskCompletion state is WaitingForActivation taskContinuation TaskCompletion state is WaitingForActivation theTask TaskCompletion state is WaitingForActivation taskContinuation TaskCompletion state is WaitingForActivation The task completed theTask TaskCompletion state is RanToCompletion taskContinuation TaskCompletion state is RanToCompletion theTask TaskCompletion state is RanToCompletion taskContinuation TaskCompletion state is RanToCompletion
きっと続きが当たって、直ぐ待っている Task も完了するはずですよね?この動作には、どのような外部 (呼び出し) 要因が考えられますか?