c# - 在 foreach 中同步调用异步
问题描述
我有像这样定义 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 从那时起我无法将其绑定到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
完成,您可以这样做(不需要异步或等待):
Task.WhenAll(requests.Select(x => client.callAsync(x)).Wait();
推荐阅读
- azure - 在不同项目中链接 Azure DevOps Repos
- arrays - 用于渲染 url `${item}` 的函数 array.find() 反应原生不起作用
- rpm - yum 在实际的“必需”包之前安装“提供”包
- node.js - 节点中的线程与其他编程语言
- reactjs - React 钩子和条件
- c# - 硬代码大十六进制值在 C# 中引发错误
- javascript - 域地址的 CORS 问题,但使用直接 IP 地址和 localhost 可以正常工作
- c# - 如何在 C# 中解析一个简单的 JSON 对象?
- java - 二进制 XML 文件第 52 行:二进制 XML 文件第 52 行:膨胀类 com.askira.loopingviewpager.LoopingViewPager 时出错
- javascript - 按客户端过滤 Web 通知