如何在异步任务中等待事件

时间:2019-06-27 00:02:53

标签: c# asynchronous .net-core stripe-payments

我想知道如何在我的一种异步方法中等待特定事件。我希望对现代EF-Core框架中的事件系统以及可能在我的用例中发生的副作用有一些提示。用例说明来了。

我将Angular应用程序(作为客户端)和.net EF-Core 2.2应用程序(作为服务器)组合在一起。我正在尝试将stripe集成到我的项目中。我还想在服务器端处理所有付款工作。

此刻,当用户尝试更改其对我的产品之一的当前订阅时,客户端将后请求发送到我的服务器。之后,服务器向条带发出请求。这种对条带的请求返回某种条带对象,我将其存储以处理即将发生的事件。此时此刻,我的服务器请求完成了,无法响应客户所需的信息,例如如果所需的请求完成得很好,或者出现了某种错误。同时,侧面的条纹可以​​完成一些工作。完成后,它将通过webhook通知我的服务器发生了某些事件。我正在服务器端处理此事件,除一件事情外,其他一切都很完美:我的客户端对服务器处理的条带事件一无所知。

我想解决这个问题的想法是等待客户端发出的初始请求,直到触发我的Web挂机为止,最好是超时,比如说10秒。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

您需要创建一个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.
}