等待或超时异步操作

时间:2015-02-15 08:17:25

标签: c# asp.net multithreading asynchronous async-await

请参阅下面的代码

HttpResponseMessage messge = client.GetAsync("ladders/get/"+ID+").Result;
if (messge.IsSuccessStatusCode)
{
   string result = messge.Content.ReadAsStringAsync().Result;
}

我需要执行此代码,直到"结果"变量不为null或最多30分钟。每分钟都会执行以下代码,直到(结果!= null)在30分钟内完成。

HttpResponseMessage messge = client.GetAsync("ladders/get/"+ID+").Result;

让我们看看,如果没有得到"结果"值30分钟后30分钟后功能将自动停止&通知用户未找到的值。同时用户可以访问其他页面。

请建议我如何解决这个问题.....

1 个答案:

答案 0 :(得分:4)

我首先建议你不要阻止使用.ResultHttpClient公开的API本质上是异步的。通过使用它,您可能会在代码中引入您可能不想要的死锁。

基本上,您要实现的是“第一个任务获胜”操作。为此,当HttpClient.GetAsync已经返回Task时,您可以使用另一个使用内部使用计时器的Task.Delay的任务。并且,您将await首先完成任务:

public async Task GetAsync()
{
    var expirationTimeTask = Task.Delay(TimeSpan.FromMinutes(30));
    var responseTask = client.GetAsync("ladders/get/ " + ID);

    var finishedTask = await Task.WhenAny(expirationTimeTask, responseTask);
    if (finishedTask == expirationTimeTask)
    {
        // If we get here, the timer passed 30 minutes
    }
    else
    {
        // If we get here, we got a response message first.
        if (responseTask.IsSuccessStatusCode)
        {
            string result = await responseTask.Content.ReadAsStringAsync();
        }   
    }
}