-1

我需要等待整个任务完成然后返回一个值。我的代码给了我一个“并非所有代码路径都返回值”的错误。你能告诉我如何解决这个问题吗?我真的对任务感到困惑。

 public async override Task<TagInfoReply> GetInfo(TagInfoRequest request, ServerCallContext context)
        {
            var tagInfo = JsonSerializer.Deserialize<TagInfo>(request.TagInfo);
            var parameter = JsonSerializer.Deserialize<ParameterGetWhiteListWithEntryInfo>(request.DetectedTag);
            var task = Task.Run(() =>
            {
                return filters.FilterTags(tagInfo);
            });
            await task.ContinueWith(
                    async antecedent =>
                    {
                        if (antecedent.Result)
                        {
                            var reply = await pcs.GetTagInfo(parameter, tagInfo, TagFilterTime);
                            return new TagInfoReply
                            {
                                FetchedTagInfo = reply
                            };
                        }
                        else
                        {
                            return new TagInfoReply
                            {
                                FetchedTagInfo = string.Empty
                            };
                        }
                    }, TaskContinuationOptions.OnlyOnRanToCompletion);
        }

如果我放一个

return new TagInfoReply
                                {
                                    FetchedTagInfo = string.Empty
                                };

在任务的最后和外部。继续,错误消失了,但问题是当它运行时,它不会等待任务完成。它直接进入最后一个返回。

4

2 回答 2

1

目前,您的return代码仅从您传递给的匿名方法返回ContinueWith,并且它们返回中的调用代码ContinueWith。你实际上并没有从GetInfo.

的结果ContinueWith作为结果提供给您,因此您应该能够像这样重写您的代码:

public async override Task<TagInfoReply> GetInfo(TagInfoRequest request, ServerCallContext context)
{
    var tagInfo = JsonSerializer.Deserialize<TagInfo>(request.TagInfo);
    var parameter = JsonSerializer.Deserialize<ParameterGetWhiteListWithEntryInfo>(request.DetectedTag);
    var task = Task.Run(() =>
    {
        return filters.FilterTags(tagInfo);
    });
    return await task.ContinueWith(
            async antecedent =>
            {
                if (antecedent.Result)
                {
                    var reply = await pcs.GetTagInfo(parameter, tagInfo, TagFilterTime);
                    return new TagInfoReply
                    {
                        FetchedTagInfo = reply
                    };
                }
                else
                {
                    return new TagInfoReply
                    {
                        FetchedTagInfo = string.Empty
                    };
                }
            }, TaskContinuationOptions.OnlyOnRanToCompletion);
}
于 2021-10-27T02:49:33.237 回答
1

您问题的核心是您需要返回一个值。一个附带问题是您根本不应该使用ContinueWith。如果您替换ContinueWithawait,那么您的代码会变得更加清晰:

public async override Task<TagInfoReply> GetInfo(TagInfoRequest request, ServerCallContext context)
{
  var tagInfo = JsonSerializer.Deserialize<TagInfo>(request.TagInfo);
  var parameter = JsonSerializer.Deserialize<ParameterGetWhiteListWithEntryInfo>(request.DetectedTag);
  var result = await Task.Run(() =>
  {
    var filteredTags = filters.FilterTags(tagInfo);
    if (antecedent.Result)
    {
      var reply = await pcs.GetTagInfo(parameter, tagInfo, TagFilterTime);
      return new TagInfoReply
      {
          FetchedTagInfo = reply
      };
    }
    else
    {
      return new TagInfoReply
      {
          FetchedTagInfo = string.Empty
      };
    }
  });
  return result;
}

您也可能不需要Task.Run那里:

public async override Task<TagInfoReply> GetInfo(TagInfoRequest request, ServerCallContext context)
{
  var tagInfo = JsonSerializer.Deserialize<TagInfo>(request.TagInfo);
  var parameter = JsonSerializer.Deserialize<ParameterGetWhiteListWithEntryInfo>(request.DetectedTag);
  var filteredTags = filters.FilterTags(tagInfo);
  if (antecedent.Result)
  {
    var reply = await pcs.GetTagInfo(parameter, tagInfo, TagFilterTime);
    return new TagInfoReply
    {
        FetchedTagInfo = reply
    };
  }
  else
  {
    return new TagInfoReply
    {
        FetchedTagInfo = string.Empty
    };
  }
}
于 2021-11-17T01:08:22.337 回答