隐式的等待
本文关键字:等待 | 更新日期: 2023-09-27 17:51:22
我有一个方法Create
:
public async Task<MyObject> Create(string str1, string str2)
{
// Check to see if a MyObject can be created in the database.
if (!await CanCreate(str1, str2))
{
return null;
}
// Create the object.
var myObj = new MyObject
{
Created = DateTime.Now.Date,
First = str1,
Second = str2
};
// Log this event.
_loggingService.Log(myObj, LogType.Created);
// Return the created MyObject.
return _repository.CreateAsync(myObj));
}
方法CanCreate(string, string)
返回一个Task<bool>
。
方法Log(MyObject, LogType)
返回Task
。
方法CreateAsync(MyObject)
返回一个Task<MyObject>
。
注意CanCreate
是等待的,而Log
和CreateAsync
都不是等待的。我的问题是,在我的例子中,当Create
返回并等待如下:
var result = await _service.Create("abc", "def");
Log
是否也在等待Create
上的await调用?
创建时的await调用是否也在等待日志?
不,不是。Log
将通过,它产生的封装任务将被忽略(以及它传播的任何异常)。因为您最终会从CreateAsync
返回任务,所以它将被等待。
不,不会等待Log
方法。
当您调用没有await
关键字的async
方法时,会发生的情况是该方法被调用,但原始线程不会"等待"它完成。它通常被称为fire and forget
。
一般来说,最好await
所有async
方法,但这取决于具体情况。