我发现TaskCompletionSource.SetResult();在返回前调用等待任务的代码.在我的情况下,导致僵局.
这是一个在普通线程中启动的简化版本
void ReceiverRun()
while (true)
{
var msg = ReadNextMessage();
TaskCompletionSource task = requests[msg.RequestID];
if(msg.Error == null)
task.SetResult(msg);
else
task.SetException(new Exception(msg.Error));
}
}
代码的“异步”部分看起来像这样.
await SendAwaitResponse("first message");
SendAwaitResponse("second message").Wait();
等待实际上嵌套在非异步调用中.
SendAwaitResponse(简化)
public static Task SendAwaitResponse(string msg)
{
var t = new TaskCompletionSource();
requests.Add(GetID(msg), t);
stream.Write(msg);
return t.Task;
}
我的假设是第二个SendAwaitResponse将在ThreadPool线程中执行,但它继续在为ReceiverRun创建的线程中.
有没有设置任务的结果,而不用继续等待已久的代码?
该应用程序是一个控制台应用程序.