【问题标题】:Polling in C# using async await在 C# 中使用异步等待轮询
【发布时间】:2020-12-28 16:18:33
【问题描述】:

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

谢谢, 萨尔

【问题讨论】:

  • 您可以考虑使用Timer 类。
  • 发布您的代码。你不需要Task.Run 来使用Task.Delayawait Task.Delay(...) 就足够了。你描述的可能是一对线,例如while(true){ var result=await client.GetStringAsync();....; await Task.Delay(delay); }。如果你已经把你所有的代码放在MethodA 你可以写while(true){ await MethodA(); await Task.Delay(..); }

标签: c# async-await polling


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-12-04
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2021-10-22
    • 2021-12-20
    • 2020-07-11
    • 2017-04-17
    • 1970-01-01
    相关资源
    最近更新 更多