首先,很抱歉--我无法在适当简单的示例应用程序中重现此行为。 在调用代码进行了一些重构之前,该功能是有效的。
我试图使用TaskCompletionSource来标志异步操作的结束(长时间运行的进程完成或超时可能会使用TrySetResult()来标志完成)。
我的问题是,即使我可以看到Task从“WaitingForActivation”转换为“RanToCompletion”,但等待的调用永远不会完成。
作为测试,我创建了一个任务连续体,并且这正在被调用。 我添加了一个计时器来显示任务状态:
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
SynchronizationContext.Current != null
是否成立。 - i3arnon