3

まず、お詫び申し上げます。適切な単純なサンプル アプリケーションでこの動作を再現することはできません。この機能は、呼び出しコードのリファクタリングの前に機能していました。

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 も完了するはずですよね?この動作には、どのような外部 (呼び出し) 要因が考えられますか?

4

1 に答える 1