Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务“;“尚未计算”:异步模块或处理程序在异步操作仍挂起时完成_C#_Wcf_Entity Framework_Asynchronous_.net 4.5 - Fatal编程技术网

C# 任务“;“尚未计算”:异步模块或处理程序在异步操作仍挂起时完成

C# 任务“;“尚未计算”:异步模块或处理程序在异步操作仍挂起时完成,c#,wcf,entity-framework,asynchronous,.net-4.5,C#,Wcf,Entity Framework,Asynchronous,.net 4.5,一直在优化客户端搜索功能,以便他可以一次执行多个搜索,而不会影响加载时间(至少不会太多)。 搜索的工作方式是,首先获取外部服务的json,将其转换为datacontract,然后将其保存在数据库中并返回实体对象 以前,我将所有这些都放在一个方法中,并成功地异步加载了多个搜索,但后来我认为,如果我能够将获取json的服务调用与将json保存到我们自己的数据库中并返回对象的部分分开,那么它应该能够运行得更快,因为搜索服务实际上是真正的搜索 现在我有两份运营合同: [OperationCont

一直在优化客户端搜索功能,以便他可以一次执行多个搜索,而不会影响加载时间(至少不会太多)。 搜索的工作方式是,首先获取外部服务的json,将其转换为datacontract,然后将其保存在数据库中并返回实体对象

以前,我将所有这些都放在一个方法中,并成功地异步加载了多个搜索,但后来我认为,如果我能够将获取json的服务调用与将json保存到我们自己的数据库中并返回对象的部分分开,那么它应该能够运行得更快,因为搜索服务实际上是真正的搜索

现在我有两份运营合同:

    [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)));
}