【问题标题】:How to wait for an event in a async Task [closed]如何在异步任务中等待事件[关闭]
【发布时间】:2019-11-08 23:05:47
【问题描述】:

我想知道如何在我的一种异步方法中等待特定事件。我很想了解现代 EF-Core 框架中的事件系统和可能出现在我的用例中的副作用。用例描述来了。

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

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

我处理这个问题的想法是等待客户端发出的初始请求,直到我的网络挂钩被触发,最好是超时,比如说 10 秒。有什么建议吗?

【问题讨论】:

  • 阅读 SignalR。
  • 你的代码在哪里?

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


【解决方案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.
}

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 2014-09-06
    • 1970-01-01
    • 2014-03-18
    • 2016-07-24
    • 1970-01-01
    • 2013-02-10
    • 2017-07-22
    • 1970-01-01
    相关资源
    最近更新 更多