如何重构异步方法以包含等待运算符?
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>>
。这可以等待。
我添加了一个异步任务,它使用 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>>
。这可以等待。