C# 同步API调用是否应包装为异步?

C# 同步API调用是否应包装为异步?,c#,asp.net-mvc,async-await,threadpool,C#,Asp.net Mvc,Async Await,Threadpool,我在互联网上读到一些帖子和文章,说我不应该使用异步,直到我的调用是IO读取文件、发送请求等。。但是,如果调用的API实际上是一个与IO相关的API,并且不支持异步调用,我应该用Task.Run包装它们吗 比方说,如果我让MVC服务器通过API调用外部服务器来获取数据,但API没有异步方法。在这种情况下,使用async包装同步调用是否有好处 据我所知,如果没有包装,那么对API的所有调用都是同步的,对我的MVC应用程序的每个调用都使用线程池中的一个线程。在第二种情况下,Task.Run将把我的任务

我在互联网上读到一些帖子和文章,说我不应该使用异步,直到我的调用是IO读取文件、发送请求等。。但是,如果调用的API实际上是一个与IO相关的API,并且不支持异步调用,我应该用Task.Run包装它们吗

比方说,如果我让MVC服务器通过API调用外部服务器来获取数据,但API没有异步方法。在这种情况下,使用async包装同步调用是否有好处

据我所知,如果没有包装,那么对API的所有调用都是同步的,对我的MVC应用程序的每个调用都使用线程池中的一个线程。在第二种情况下,Task.Run将把我的任务排入线程池,但释放主线程。发布的主线程在这里被认为是有益的,还是不值得包装?我说的对吗

编辑 好的,这是人们要求的更多细节

我有一个被迫使用的第三方.NET程序集。我不能直接调用web服务。看起来很像这样:

//API我不是它的所有者,无法更改它: 公务舱服务{ /*一切都是这样同步的,但在里面的某个地方 它仍然向外部服务器发出HTTP请求,因此 有点像IO。只是lib非常旧,不提供异步方法*/ 公共数据GetDataParameters参数; } //我的密码来了。 //备选案文1。同步控制器 公共类MyController{ 公共操作结果GetDataBydString id{ var data=new Service.GetDatanew参数{Id=Id}; //处理并返回一些结果。。。 } } //备选案文2。异步控制器 公共类MyController{ 公共异步ActionResult GetDataBydString id{ var result=await Task.Run=>new Service.GetDatanew参数{Id=Id}; //处理并返回一些结果。。。 } }
所以问题是,做选择2有意义吗

通过包装为async,您可以获得对外部服务器进行并行调用的好处,而实际调用仍将保持同步,因此这就像多个线程各自等待外部服务器的响应一样。我已经这样做了,如果您希望处理失败,那么应用程序就不会停留在调用线程中,这将是有益的

比方说,如果API本身执行IO相关任务,那么即使用户选择通过API执行多个任务,拥有一个空闲的主线程也会让您受益。如果用户选择通过API执行多个任务,那么您将受益于让主线程空闲,而不是在单个请求上阻塞它

进一步解释,API是web API吗?如何从MVC应用程序调用API?你想解决什么问题?以异步方式运行同步代码并没有给您带来任何好处,事实上,由于线程池必须排队并消耗工作,您正在导致更大的性能下降。如果您可以以本机方式进行异步,那么您应该这样做。@ColinM,我已经更新了我的初始问题。谢谢。在所描述的场景中,您只是增加了一点开销,用于向线程池发送信号,告知它必须安排一个新的工作项,然后您将立即等待该工作完成。如果它真的是异步的,那么您就可以将多个工作项排队,并使用wait Task等待它们。。。;所以基本上,这是没有意义的。好的,谢谢。