У вас есть состояние гонки здесь. Цитата из этой темы репозитория RX :
FirstAsync возвращает наблюдаемую холодность. Пока вы не подпишетесь на
ожидайте получения сообщений.
В отличие от TaskCompletionSource
(использование которого может быть более подходящим здесь, IMO), наблюдаемое, возвращаемое FirstAsync
, не "кэширует" событие, которое произошло до активации вами подписки. в ожидании этого. Таким образом, событие process.Exited
запускается до await obs.FirstAsync()
, и поэтому код запуска .NET блокирует задачу, возвращаемую Main
.
Следующее будет работать как положено (вам нужно добавить using System.Reactive.Threading.Tasks
):
var task = obs.FirstAsync().ToTask();
var started = process.Start();
if (!started)
{
throw new InvalidOperationException("Could not start process: " + process);
}
await task;
Здесь мы активируем наблюдаемую подписку, преобразовав ее в Task
перед началом процесса.
Если вас интересует что-то вроде Observable.FromEventPattern
, но для TaskCompletionSource
, отметьте это Q / A .