为了账号安全,请及时绑定邮箱和手机立即绑定

运行没有等待的任务方法

运行没有等待的任务方法

C#
一只萌萌小番薯 2022-01-16 16:17:11
假设我有以下方法:public async Task<bool> DoSomeStuffWithAsync(){   //do some stuff without calling await   return true;}我这样称呼它:await DoSomeStuffWithAsync(); 这与此方法的运行是否有任何不同:public bool DoSomeStuff(){   return true;}被这样称呼:DoSomeStuff();我在想,因为DoSomeStuffWithAsync实际上并没有调用await它的代码,所以它仍然会像DoSomeStuff.构建我的方法有什么好处 DoSomeStuffWithAsync吗?
查看完整描述

3 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

请注意,使用async不使用的方法await被认为是不好的样式。如果你有一个返回任务的同步方法,你应该使用Task.FromResult:


public Task<bool> DoSomeStuffWithAsync()

{

   return Task.FromResult(true);

}

但是,是的,仅此而已:返回任务的同步方法。它没有异步,所以它实际上与只返回一个布尔值的普通同步代码没有任何不同。


直接返回任务而不是返回值还有好处吗?那要看。有时,您可能需要实现一个异步接口,但实际上并没有异步实现它。但是,如果您不必这样做,并且您也不考虑最终更改您的实现以实际异步执行某些操作,那么让您的方法返回任务没有任何好处。


至于调用,await DoSomeStuffWithAsync()将运行DoSomeStuffWithAsync()然后等待它返回的任务。既然DoSomeStuffWithAsync()是同步的,任务会直接返回,既然任务已经完成,await就可以直接继续。所以这与同步调用方法非常相似。但是,它的存在await确实会对运行时行为产生影响,因为这将使调用方法实际上是异步的(即使被调用的代码是同步的)。


但由您决定这是否适合您的情况。不过,一般来说,当不涉及真正的异步过程时,您可能应该避免让它看起来是异步的。


查看完整回答
反对 回复 2022-01-16
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

简而言之,async关键字不会使方法异步运行。它只允许方法在await里面调用关键字。这就是魔法发生的地方。在您的情况下,您在任何地方都没有任何await关键字表明您的方法确实没有异步运行。


查看完整回答
反对 回复 2022-01-16
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

你的方法返回不同的东西。DoSomeStuffWithAsync() 返回一个Task<bool>. 您可以在没有“async”关键字的情况下调用它 - 同步 - 编译器将在方法完成后返回包装在实例中的Task<bool>bool - 它在幕后执行此操作。另一个“区别”是您如何处理返回的值。 .


var task = DoSomeStuffWithAsync(); // Synchronous call

Console.WriteLine(task.Result); // You must unpack the bool result...

您的其他方法只返回一个布尔值 - 它只是一个标准的同步调用/返回......


var result = DoSomeStuff(); // Synchronous call

Console.WriteLine(result);  // Just use the result

从行为的角度来看,要回答您的具体问题,两者的行为都是同步的。另一种看待它的方式:


var act = new Func<Task<bool>>(async () => await DoSomeStuffWithAsync()); 

var result = act(); // will complete when DoSomeStuffWithAsync completes

希望这能回答你的问题。


查看完整回答
反对 回复 2022-01-16
  • 3 回答
  • 0 关注
  • 241 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号