运行没有等待的Task方法

问题描述 投票:0回答:3

假设我有以下方法:

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那样构造我的方法有什么好处吗?

c# asynchronous async-await
3个回答
4
投票

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

public Task<bool> DoSomeStuffWithAsync()
{
   return Task.FromResult(true);
}

但是,是的,这就是:一个返回任务的同步方法。关于它没有异步,所以这实际上并没有与只返回bool的普通同步代码不同。

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

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

但是由您来决定是否适合您的情况。通常,在没有涉及真正的异步过程时,您应该避免使它看起来是异步的。


1
投票

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


1
投票

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

var task = DoSomeStuffWithAsync(); // Synchronous call
Console.WriteLine(task.Result); // You must unpack the bool result...

你的另一种方法只返回一个bool - 它只是一个标准的同步调用/返回...

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

希望这能回答你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.