请参阅下面的代码
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分钟后功能将自动停止&通知用户未找到的值。同时用户可以访问其他页面。
请建议我如何解决这个问题.....
答案 0 :(得分:4)
我首先建议你不要阻止使用.Result
。 HttpClient
公开的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();
}
}
}