Я обнаружил, что TaskCompletionSource.SetResult();
вызывает код, ожидающий задачи, перед возвратом. В моем случае это приводит к тупиковой ситуации.
Это упрощенная версия, которая запускается в обычном Thread
void ReceiverRun()
while (true)
{
var msg = ReadNextMessage();
TaskCompletionSource<Response> 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<Response> SendAwaitResponse(string msg)
{
var t = new TaskCompletionSource<Response>();
requests.Add(GetID(msg), t);
stream.Write(msg);
return t.Task;
}
Мое предположение заключалось в том, что второй SendAwaitResponse будет выполняться в потоке ThreadPool, но он продолжается в потоке, созданном для ReceiverRun.
Есть ли способ установить результат задачи без продолжения ожидаемого кода?
Приложение представляет собой консольное приложение .