Как ожидать события в асинхронной задаче [в ожидании]

Я хотел бы знать, как ожидать определенного события в одном из моих асинхронных методов. Я хотел бы получить подсказки о системе событий в современной EF-Core Framework и возможных побочных эффектах, которые могут возникнуть в моем случае использования. Приходит описание варианта использования.

У меня есть комбинация Angular Application на стороне клиента и .net EF-Core 2.2 Application на стороне сервера. Я пытаюсь интегрировать нашивку в свой проект. Я также хотел бы обработать всю работу по оплате на стороне сервера.

В этот самый момент, когда пользователь пытается изменить свою текущую подписку на один из моих продуктов, клиент отправляет Post-Request на мой сервер. После этого сервер выдает запрос на полосу. Этот запрос на чередование возвращает какой-то чередующийся объект, который я храню для обработки предстоящих событий. В этот момент мой запрос к серверу завершается, и нет способа ответить клиенту необходимой информацией, например, если разыскиваемый запрос завершился успешно, или произошла какая-то ошибка. Тем временем, полоса на его стороне делает некоторую работу. Когда это заканчивается, он сообщает моему серверу через webhook, что произошло определенное событие. Я обрабатываю это событие на стороне сервера, и все идеально, кроме одной вещи: мой клиент ничего не знает о событии stripe, которое обрабатывает мой сервер.

Моя идея решить эту проблему состояла бы в том, чтобы подождать в исходном запросе, выданном клиентом, до срабатывания моего веб-хука, предпочтительно с таймаутом, скажем, 10 секунд. Есть предложения?

0
задан Fattum 27 June 2019 в 00:02
поделиться

1 ответ

Вам нужно создать TaskCompletionSource и зарегистрировать обработчик события, чтобы завершить его, а затем дождаться его Task.

var source = new TaskCompletionSource<(object, EventArgs)>();  //Change the EventArgs type to the actual event args type that the event passes.

EVENT_YOU_WISH_TO_WAIT_FOR += (s, e) => source.TrySetResult((s, e));

async void timeout()
{
    await Task.Delay(10000);  //10 secs
    source.TrySetException(new TaskCanceledException());
}

timeout();

try
{
    var (sender, @event) = await source.Task;

    //Statements here would be executed on the event is raised.
    //Do things with sender and @event provided.
}
catch (TaskCanceledException)
{
    //Handle timeout.
}
2
ответ дан Alsein 27 June 2019 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: