请参阅下面的我的代码
HttpResponseMessage messge = client.GetAsync("ladders/get/"+ID+").Result;
if (messge.IsSuccessStatusCode)
{
string result = messge.Content.ReadAsStringAsync().Result;
}
我需要执行此代码,直到“结果”变量不为空或最多 30 分钟。每分钟都会执行以下代码,直到 30 分钟内 (result !=null)。
HttpResponseMessage messge = client.GetAsync("ladders/get/"+ID+").Result;
让我们看看,如果在 30 分钟内没有获得“结果”值,则 30 分钟后功能将自动停止并通知用户未找到该值。同时用户可以访问其他页面。
请建议我如何解决这个问题......
最佳答案
我首先建议您不要使用 .Result
进行阻止。 HttpClient
公开的 API 本质上是异步的。通过使用它,您可能会在代码中引入您可能不希望出现的死锁。
基本上,您想要实现的是“第一个任务获胜”操作。为此,由于 HttpClient.GetAsync
已经返回一个 Task
,您可以使用 Task.Delay
执行另一个任务,该任务内部使用计时器。并且,您将等待
哪个任务先完成:
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();
}
}
}
关于c# - 异步操作等待或超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28524212/