c# – 这些等待方法有什么区别?

c# – 这些等待方法有什么区别?,第1张

概述我正在研究C#中的一些异步编程,并想知道这些函数之间的区别在于它们完全相同并且都是等待的. public Task<Bar> GetBar(string fooId){ return Task.Run(() => { var fooService = new FooService(); var bar = fooService.GetBar(foo 我正在研究C#中的一些异步编程,并想知道这些函数之间的区别在于它们完全相同并且都是等待的.
public Task<bar> Getbar(string fooID){    return Task.Run(() =>    {        var fooService = new FooService();        var bar = fooService.Getbar(fooID);        return bar;    });}public Task<bar> Getbar(string fooID){    var fooService = new FooService();    var bar = fooService.Getbar(fooID);    return Task.Fromresult(bar)}public async Task<bar> Getbar(string fooID){    return await Task.Run(() =>    {        var fooService = new FooService();        var bar = fooService.Getbar(fooID);        return bar;    });}

我的猜测是,第一种是正确的做事方式,并且在您尝试从返回的Task获取结果之前,代码不会执行.

在第二种情况下,代码在调用时执行,结果存储在返回的任务中.

第三种有点像第二种?代码是在调用时执行的,Task.Run的结果是返回?在这种情况下,这个函数会有点愚蠢吗?

我是对的还是离开的?

解决方法 这些方法实现都没有意义.您所做的就是将阻塞工作推送到线程池(或者更糟糕的是,同步运行它并将结果包装在Task< bar>实例中).你应该做的是暴露同步API,让调用者决定如何调用它.他们是否想要使用Task.Run然后由他们决定.

话虽如此,这里有不同之处:

#1

第一个变体(它返回一个Task< bar>直接通过Task.Run创建)是“最纯粹的”,即使它从API的角度来看没有多大意义.您允许Task.Run在线程池上安排给定的工作并返回Task< bar>表示对调用者的异步 *** 作的完成.

#2

第二种方法(利用Task.Fromresult)不是异步的.它同步执行,就像常规方法调用一样.结果只包含在一个完整的Task< bar>中.实例.

#3

这是第一个更复杂的版本.你正在实现类似于#1的结果,但是有额外的,不必要的,甚至有点危险的等待.这个值得更详细地看一下.

async / await非常适合链接异步 *** 作,通过将表示异步工作的多个任务组合到一个单元中(任务).它可以帮助您按正确的顺序进行 *** 作,为您提供异步 *** 作之间丰富的控制流,并确保在正确的线程上发生事情.

但是,上述情况都不会对您的方案有任何好处,因为您只有一个任务.因此,没有必要让编译器生成一个状态机,只是为了完成Task.Run已经完成的工作.

设计糟糕的异步方法也很危险.通过在等待的任务上不使用ConfigureAwait(false),您无意中引入了SynchronizationContext捕获,从而导致性能下降并引入死锁风险,从而无益.

如果您的来电者决定阻止您的任务< bar>在具有SynchronizationContext(即Win Forms,WPF和可能的ASP.NET)的环境中,通过Getbar(fooID).Wait()或Getbar(fooID).Result,由于here讨论的原因,它们将陷入僵局.

总结

以上是内存溢出为你收集整理的c# – 这些等待方法有什么区别?全部内容,希望文章能够帮你解决c# – 这些等待方法有什么区别?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1252354.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存