假设我有以下方法:
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
那样构造我的方法有什么好处吗?
请注意,使用async
作为不使用await
的方法被认为是一种不好的风格。如果你有一个返回任务的同步方法,你应该使用Task.FromResult
代替:
public Task<bool> DoSomeStuffWithAsync()
{
return Task.FromResult(true);
}
但是,是的,这就是:一个返回任务的同步方法。关于它没有异步,所以这实际上并没有与只返回bool的普通同步代码不同。
返回任务而不是直接返回值仍然有好处吗?那要看。有时,您可能需要实现一个异步接口,但实际上并没有异步实现。但是如果您不必这样做,并且如果您也不考虑最终将实现更改为实际异步执行某些操作,那么使您的方法返回任务没有任何好处。
至于电话会议,await DoSomeStuffWithAsync()
将运行DoSomeStuffWithAsync()
,然后等待它返回的任务。由于DoSomeStuffWithAsync()
是同步的,任务将直接返回,并且由于任务已经完成,await
将能够直接继续。所以这与同步调用方法非常相似。然而,await
的存在确实会对运行时行为产生影响,因为这会使调用方法实际上异步(即使被调用的代码是同步的)。
但是由您来决定是否适合您的情况。通常,在没有涉及真正的异步过程时,您应该避免使它看起来是异步的。
简而言之,async
关键字不会使方法异步运行。它只允许该方法在里面调用await
关键字。这就是魔术发生的地方。在你的情况下,你没有任何await
关键字,表明你的方法确实不是异步运行。
你的方法返回不同的东西。 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
希望这能回答你的问题。