async方法可以阻塞变量而不是调用方法吗?

时间:2016-12-17 01:15:39

标签: c# asp.net-web-api

尝试编写API,我有一个奇怪的案例,我试图解决如下:

        if (!request.WillCheckGetLater)
        {
            // Client calling is willing to wait only for certain amount of time
            var clientWillingToWaitFor = GetResponseTime(request);
            var needsToUpdateResponse = await AwaitResponse(heldBidRequest, clientWillingToWaitFor);
            SendMessage(...);
            return needsToUpdateResponse;
        }
        else
        {
            SendMessage(...);
            return false;
        }

在我的Post方法中,我试图等待该方法。基本上当我收到帖子时,我会构建一个"短片"回答,并且客户检查" long"回答API中的GET方法,但也可以直接在POST中询问长答案,但必须指定他愿意等多长时间答案,否则我默认为#34;短"回答...

我的SendMessage方法基本上是我订阅和发布消息的第三方通信系统。

现在,当行

 var needsToUpdateResponse = await AwaitResponse(heldBidRequest, clientWillingToWaitFor);

执行,它会阻止这段代码并且SendMessage不会执行直到任务结束,理想情况下我宁愿在返回时阻止它。

我没有必要想要调用SendMessage First只是因为奇怪的情况我可以得到消息的响应在我设置等待它之前。

关于我可以用来做什么的任何想法?

2 个答案:

答案 0 :(得分:5)

实际上,你已经等待“变量”(实际上是返回值)。您无法等待方法,只能等待任务。准备好后,只需存储任务而不是Tawait

var needsToUpdateResponse = AwaitResponse(heldBidRequest, clientWillingToWaitFor);
SendMessage(...);
return await needsToUpdateResponse;

如果我们不使用var

,那就更明显了
Task<T> needsToUpdateResponse = AwaitResponse(heldBidRequest, clientWillingToWaitFor);
SendMessage(...);
return await needsToUpdateResponse;

答案 1 :(得分:0)

您可以从任务中获取等待者,并获得您想要的结果。但是,当你需要结果时,基本上你在等待方法。

请参阅此参考https://stackoverflow.com/a/17284612/819153