如何重构异步方法以包含等待运算符?

How to refactor async method to include await operators?

我添加了一个异步任务,它使用 MongoDB.Net driver 将列表分配给新的 Bson 文档。我收到有关该方法的警告,说我应该将 await 运算符添加到 API 调用中。

所以我尝试的是,在 API 调用中添加一个 await,但它给了我一个错误:

Error 9 Cannot await 'System.Collections.Generic.List'

我知道我不能等待列表类型,但不确定将运算符放在其他什么地方。我在想可以将 Find 调用重构为一个任务,然后将结果分配给客户。

客户名单为供参考的类型

有谁知道我应该如何将 await 运算符添加到 API 调用?

这是我在方法上添加 await 运算符的地方:

public async Task LoadDb()
{
    var customerCollection = StartConnection();
    try
    {
        customers = await customerCollection.Find(new BsonDocument()).ToListAsync().GetAwaiter().GetResult();

    }
    catch (MongoException ex)
    {
        //Log exception here:
        MessageBox.Show("A connection error occurred: " + ex.Message, "Connection Exception", MessageBoxButton.OK, MessageBoxImage.Warning);
    }
}

这是 customerCollection 来自的 StartConnection()

public IMongoCollection<CustomerModel> StartConnection()
{
    var client = new MongoClient(connectionString);
    var database = client.GetDatabase("orders");
    //Get a handle on the customers collection:
    var collection = database.GetCollection<CustomerModel>("customers");
    return collection;
}

这行代码:

customers = await customerCollection.Find(new BsonDocument()).ToListAsync().GetAwaiter().GetResult();

应该改成这样:

customers = await customerCollection.Find(new BsonDocument()).ToListAsync();

你可以从你得到的错误信息中理解为什么第一个不正确。

Cannot await 'System.Collections.Generic.List'

调用 GetResult 会阻塞执行代码的线程,您正在等待调用 GetResult 的结果。 GetResult 将 return 一个 List<MongoDBApp.Models.CustomerModel>。显然你不能等待一个通用的结果。虽然您可以等待 ToListAsync 的结果,但这是一项任务。在您调用 ToListAsync 的情况下,您会得到一个 Task<List<MongoDBApp.Models.CustomerModel>>。这可以等待。