【问题标题】:How to properly utilize Coarse Grain Concurrency With I/o Bound Work Using Tasks?如何使用任务正确利用 I/o 绑定工作的粗粒度并发?
【发布时间】:2021-02-01 16:30:15
【问题描述】:

最近我对 I/O Bound 和 Cpu Bound 工作使用什么感到有点困惑,截至目前,我得出的结论(随时纠正)是:

-Task.Run() - CPU 绑定工作

-TaskCompletionSource - I/O 绑定工作

场景

您被一种基于 i/o 的工作顺序运行的方法卡住了,您无法编辑该方法,让它异步运行的最佳选择是什么?

//method example
//Purposely avoiding using the AsyncTask Version Of DownloadString In WebClient
public void Foo()=>new WebClient.DownloadString("https://google.com");

//-------

//here is the part of the code that I will be trying to execute Foo asynchronously
await Task.Run(()=>Foo()); //wouldn't this be the only way to run this method asynchronously even though Foo isn't doing CPU Bound Work?

【问题讨论】:

  • 这取决于应用程序的类型。

标签: c# .net-core async-await


【解决方案1】:

让它异步运行的最佳选择是什么?

在“正常”类型的应用程序中,当您不冒线程饥饿的风险时:Task.Run(()=>Foo()); 确实是使其异步的唯一方法。

在 ASP.NET 应用程序中,您应该更加关心您使用了多少线程。使这个与 Task.Run() 异步是请求一个额外的线程以阻止该线程。当您有其他可以同时运行的工作时,这有助于缩短响应时间,但会损害应用的整体性能和可扩展性。

所以在一个控制器动作中,一般来说:不要做任何事情。咬紧牙关阻塞当前线程,而不是请求另一个线程来等待它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    相关资源
    最近更新 更多