gpt4 book ai didi

c# - foreach 同步调用异步

转载 作者:太空宇宙 更新时间:2023-11-03 22:36:20 26 4
gpt4 key购买 nike

我有这样定义 eventCallback 的外部库:

public delegate void processEvent(string deviceType, string deviceId,string evtName, string format, string data);
// event for event callback
public event processEvent eventCallback;

在我的代码中我以这种方式订阅了这个事件

app.eventCallback += ProcessEvent;
protected void ProcessEvent(string deviceType, string deviceId, string eventName, string format, string data)
{
var requests = GetRequests();
foreach (var serviceRequest in requests)
{
client.callAsync(serviceRequest)
}
}

问题是如何异步调用client.callAsync?我无法更改 ProcessEvent 的签名以返回 Task 从那时起我就无法将它绑定(bind)到 eventCallback += ProcessEvent;

callAsync 是异步方法

我应该创建任务列表然后等待所有任务还是有更好的方法?

最佳答案

只需将 async 添加到方法签名中即可:

 protected async void ProcessEvent(string deviceType, string deviceId, string eventName, string format, string data)

之所以可行,是因为您没有更改返回类型。然后将调用更改为:

await client.callAsync(serviceRequest);

可能还想在这里使用 ConfigureAwait(false)

如果您想一次异步运行所有服务请求,请将您的 foreach 更改为:

await Task.WhenAll(requests.Select(x => client.callAsync(x));

或者您可以根据需要使用任务集合。同样的效果。

按照您的方式编写,您的事件处理程序一次处理一个请求。

如果您想在每个 Task 完成时阻塞,您可以这样做(不需要 async 或 await):

Task.WhenAll(requests.Select(x => client.callAsync(x)).Wait();

虽然它们听起来很相似,awaitTask.Wait在概念上是非常不同的东西。总之,前者是非阻塞的,后者是阻塞的。

关于c# - foreach 同步调用异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54946703/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com