隐式的等待

本文关键字:等待 | 更新日期: 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是等待的,而LogCreateAsync都不是等待的。我的问题是,在我的例子中,当Create返回并等待如下:

 var result = await _service.Create("abc", "def");

Log是否也在等待Create上的await调用?

隐式的等待

创建时的await调用是否也在等待日志?

不,不是。Log将通过,它产生的封装任务将被忽略(以及它传播的任何异常)。因为您最终会从CreateAsync返回任务,所以它将被等待。

不,不会等待Log方法。

当您调用没有await关键字的async方法时,会发生的情况是该方法被调用,但原始线程不会"等待"它完成。它通常被称为fire and forget

一般来说,最好await所有async方法,但这取决于具体情况。