我想知道如何在我的一种异步方法中等待特定事件。我希望对现代EF-Core框架中的事件系统以及可能在我的用例中发生的副作用有一些提示。用例说明来了。
我将Angular应用程序(作为客户端)和.net EF-Core 2.2应用程序(作为服务器)组合在一起。我正在尝试将stripe集成到我的项目中。我还想在服务器端处理所有付款工作。
此刻,当用户尝试更改其对我的产品之一的当前订阅时,客户端将后请求发送到我的服务器。之后,服务器向条带发出请求。这种对条带的请求返回某种条带对象,我将其存储以处理即将发生的事件。此时此刻,我的服务器请求完成了,无法响应客户所需的信息,例如如果所需的请求完成得很好,或者出现了某种错误。同时,侧面的条纹可以完成一些工作。完成后,它将通过webhook通知我的服务器发生了某些事件。我正在服务器端处理此事件,除一件事情外,其他一切都很完美:我的客户端对服务器处理的条带事件一无所知。
我想解决这个问题的想法是等待客户端发出的初始请求,直到触发我的Web挂机为止,最好是超时,比如说10秒。有什么建议吗?
答案 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.
}