提问者:小点点

传递异步委托totask.run?[副本]


null

null

我从Stephen Cleary的博客上读到,Task.run应该只用于CPU绑定的操作,显然上传一大块数据不是CPU绑定的。因此,如果我在中调用,似乎是一种错误的方式。

所以我的问题是,使用Task.Run来包装和调用异步函数是不是一种不好的做法?


共2个答案

匿名用户

调用该函数将使异步关键字散布整个调用树。

是的,这就是异步代码的要点。如果同步调用异步函数,那么它就不是异步的。

最好的解决方案是采用异步代码,并用调用它。如果由于某种原因,这不可行,那么您可以使用我的brownfield异步文章中的一个黑客。请注意,并不存在在每个场景中都有效的黑客。

例如,您可以使用线程池黑客:

Task.Run(() => UploadAsync(stream)).GetAwaiter().GetResult();

这会将异步代码包装到后台线程中(避免死锁问题,但也会阻止异步代码使用调用上下文),并阻止等待结果(使用而不是以避免错误情况下的包装器)。

但是,请注意,为异步方法公开同步包装是一种反模式。因此,提供以这种方式实现的方法将是一个糟糕的设计。

匿名用户

await UploadAsync(Sream))/code>将返回一个任务,如果您需要等待它完成,则需要等待它。在Task.run中调用async方法是没有意义的。

您可以对任务调用。wait(),这将阻塞线程,直到请求完成。

异步调用确实有“感染”整个调用树的趋势,但是我还没有找到任何合适的方法来避免这种情况。

相关问题