c# - 异步操作等待或超时

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

请参阅下面的我的代码

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/

相关文章:

c# - 我如何在 C# 中通过 newton 解析非常嵌套的 json?

c# - 什么时候使用弱事件?

Java : threaded serial port read with Java. util.concurrent 线程访问

c++ - 将参数传递给 _beginthread 函数

c# - 在C#交互窗口中执行私有(private)方法

javascript - 使用 Awesomium 在 ASP.NET Web 表单回发后自动下载

asp.net - 我应该开发哪个网站来学习asp.net?

asp.net - Visual Studio 和 Knockout.js - 捆绑、缩小和约定

c# - WPF应用程序在并发环境中被PropertyChangedEventManager挂起

c# - 具有 LDAP 身份验证的 Asp.Net Core 2.1 身份