首页 > 解决方案 > 在 C# 中使用异步等待轮询

问题描述

这是我的场景:我们有一个库,它在一个类中有一个“MethodA”,它使用 C# HttpClient 进行 http 调用并检索队列中的所有通知。我们正在使用 .NET Core 3.1。我想在同一个库中添加另一个类,它将在预定的时间间隔调用这个“MethodA”。我在我的测试应用程序中使用了 Task.Run 和 Task.Delay 来实现这一点,并且它可以工作。唯一的问题是这是一个 I/O 绑定调用,而不是 CPU 绑定操作,Stephen Cleary 建议避免在此处对 I/O 绑定调用使用Task.Run。我怎样才能做到这一点?

谢谢,萨尔

标签: c#async-awaitpolling

解决方案


您的操作系统已经以事件驱动的方式处理了 I/O 绑定调用。例如,Windows 使用重叠的文件调用来实现。

所以你的问题的答案是,不要使用线程池,等待操作系统调用Stream.ReadAsync和朋友。

编辑:我刚刚注意到你在谈论HttpClient,同样的答案也适用于那里。获取响应流并对其使用async读取调用,而不是无缘无故地占用您的线程池。


推荐阅读