运行没有等待的任务方法

假设我有以下方法:


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吗?


一只萌萌小番薯
浏览 261回答 3
3回答

偶然的你

请注意,使用async不使用的方法await被认为是不好的样式。如果你有一个返回任务的同步方法,你应该使用Task.FromResult:public Task<bool> DoSomeStuffWithAsync(){&nbsp; &nbsp;return Task.FromResult(true);}但是,是的,仅此而已:返回任务的同步方法。它没有异步,所以它实际上与只返回一个布尔值的普通同步代码没有任何不同。直接返回任务而不是返回值还有好处吗?那要看。有时,您可能需要实现一个异步接口,但实际上并没有异步实现它。但是,如果您不必这样做,并且您也不考虑最终更改您的实现以实际异步执行某些操作,那么让您的方法返回任务没有任何好处。至于调用,await DoSomeStuffWithAsync()将运行DoSomeStuffWithAsync()然后等待它返回的任务。既然DoSomeStuffWithAsync()是同步的,任务会直接返回,既然任务已经完成,await就可以直接继续。所以这与同步调用方法非常相似。但是,它的存在await确实会对运行时行为产生影响,因为这将使调用方法实际上是异步的(即使被调用的代码是同步的)。但由您决定这是否适合您的情况。不过,一般来说,当不涉及真正的异步过程时,您可能应该避免让它看起来是异步的。

一只斗牛犬

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

梦里花落0921

你的方法返回不同的东西。DoSomeStuffWithAsync() 返回一个Task<bool>. 您可以在没有“async”关键字的情况下调用它 - 同步 - 编译器将在方法完成后返回包装在实例中的Task<bool>bool - 它在幕后执行此操作。另一个“区别”是您如何处理返回的值。 .var task = DoSomeStuffWithAsync(); // Synchronous callConsole.WriteLine(task.Result); // You must unpack the bool result...您的其他方法只返回一个布尔值 - 它只是一个标准的同步调用/返回......var result = DoSomeStuff(); // Synchronous callConsole.WriteLine(result);&nbsp; // Just use the result从行为的角度来看,要回答您的具体问题,两者的行为都是同步的。另一种看待它的方式:var act = new Func<Task<bool>>(async () => await DoSomeStuffWithAsync());&nbsp;var result = act(); // will complete when DoSomeStuffWithAsync completes希望这能回答你的问题。
打开App,查看更多内容
随时随地看视频慕课网APP