C# 任务“;“尚未计算”:异步模块或处理程序在异步操作仍挂起时完成
一直在优化客户端搜索功能,以便他可以一次执行多个搜索,而不会影响加载时间(至少不会太多)。 搜索的工作方式是,首先获取外部服务的json,将其转换为datacontract,然后将其保存在数据库中并返回实体对象 以前,我将所有这些都放在一个方法中,并成功地异步加载了多个搜索,但后来我认为,如果我能够将获取json的服务调用与将json保存到我们自己的数据库中并返回对象的部分分开,那么它应该能够运行得更快,因为搜索服务实际上是真正的搜索 现在我有两份运营合同:C# 任务“;“尚未计算”:异步模块或处理程序在异步操作仍挂起时完成,c#,wcf,entity-framework,asynchronous,.net-4.5,C#,Wcf,Entity Framework,Asynchronous,.net 4.5,一直在优化客户端搜索功能,以便他可以一次执行多个搜索,而不会影响加载时间(至少不会太多)。 搜索的工作方式是,首先获取外部服务的json,将其转换为datacontract,然后将其保存在数据库中并返回实体对象 以前,我将所有这些都放在一个方法中,并成功地异步加载了多个搜索,但后来我认为,如果我能够将获取json的服务调用与将json保存到我们自己的数据库中并返回对象的部分分开,那么它应该能够运行得更快,因为搜索服务实际上是真正的搜索 现在我有两份运营合同: [OperationCont
[OperationContract]
SwepubHeader DoSwepubSearchAdvanced(string searchQuery, string hiddenSearchWord, Dictionary<string, string> advancedSearchParameters);
[OperationContract]
List<List<SearchItem>> GetSearchResults(List<SwepubHeader> headers);
我错过了什么?所有任务。结果将显示“尚未计算”。这可能与我在DoSwepubSearchAdvanced中执行HttpWebRequests有关吗?您看到的问题是由于使用了
异步void
。一般来说,应该避免异步void
您的设计中还有另一个问题:。一旦解决了async void
问题,最终还是会出现问题
正确的解决方案是用异步方法替换DoSearchAdvanced
:
public Task<SwepubHeader[]> DoSearchAdvancedAsync(
SwepubSearchServiceClient client,
string query, string[] subQuerys,
Dictionary<string, string> advancedSearchParameters)
{
return Task.WhenAll(subQuerys
.Where(subQuery => !string.IsNullOrWhiteSpace(subQuery))
.Select(subQuery => client.DoSwepubSearchAdvancedAsync(
query, subQuery, advancedSearchParameters)));
}
公共任务DosearchaAdvancedAsync(
SwepubSearchServiceClient客户端,
字符串查询,字符串[]子查询,
字典高级搜索参数)
{
返回任务时(子查询)
.Where(子查询=>!string.IsNullOrWhiteSpace(子查询))
.Select(子查询=>client.DoSwepubSearchAdvancedAsync(
查询、子查询、advancedSearchParameters);
}
然后修改您的网站调用以等待结果。您看到的问题是由于使用了
异步void
。一般来说,应该避免异步void
您的设计中还有另一个问题:。一旦解决了async void
问题,最终还是会出现问题
正确的解决方案是用异步方法替换DoSearchAdvanced
:
public Task<SwepubHeader[]> DoSearchAdvancedAsync(
SwepubSearchServiceClient client,
string query, string[] subQuerys,
Dictionary<string, string> advancedSearchParameters)
{
return Task.WhenAll(subQuerys
.Where(subQuery => !string.IsNullOrWhiteSpace(subQuery))
.Select(subQuery => client.DoSwepubSearchAdvancedAsync(
query, subQuery, advancedSearchParameters)));
}
公共任务DosearchaAdvancedAsync(
SwepubSearchServiceClient客户端,
字符串查询,字符串[]子查询,
字典高级搜索参数)
{
返回任务时(子查询)
.Where(子查询=>!string.IsNullOrWhiteSpace(子查询))
.Select(子查询=>client.DoSwepubSearchAdvancedAsync(
查询、子查询、advancedSearchParameters);
}
然后将网站调用修改为等待结果
public Task<SwepubHeader[]> DoSearchAdvancedAsync(
SwepubSearchServiceClient client,
string query, string[] subQuerys,
Dictionary<string, string> advancedSearchParameters)
{
return Task.WhenAll(subQuerys
.Where(subQuery => !string.IsNullOrWhiteSpace(subQuery))
.Select(subQuery => client.DoSwepubSearchAdvancedAsync(
query, subQuery, advancedSearchParameters)));
}