异步方法可以在变量上阻塞,而不是在调用方法时吗?

3

我正在尝试编写一个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方法中,我正在尝试等待该方法。基本上当我收到一个post时,我构造一个“短”答案,客户端使用API的GET方法检查“长”答案,但也可以直接在POST中请求长答案,但必须指定他愿意等待多久才能得到长答案,否则我会默认返回“短”答案...
我的SendMessage方法基本上是第三方通讯系统,我在其中订阅和发布消息。
现在,在这一行:

 var needsToUpdateResponse = await AwaitResponse(heldBidRequest, clientWillingToWaitFor);

当执行此代码时,它会阻塞并等待任务完成,直到SendMessage执行完毕。理想情况下,我希望它在返回时被阻塞。

我不想仅仅因为可能出现消息响应在等待设置之前就到来的奇怪情况而首先调用SendMessage。

你有什么好的想法可以解决这个问题吗?

2个回答

5

是的

事实上,你已经在等待“变量”(实际上是返回值)。你不能等待一个方法,只能等待一个任务。只需将任务存储下来,而不是T,并在准备好时await它:

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

如果我们不使用var,那么这将更加明显:

Task<T> needsToUpdateResponse = AwaitResponse(heldBidRequest, clientWillingToWaitFor);
SendMessage(...);
return await needsToUpdateResponse;

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接