【问题标题】:GetStringAsync timeout has no effectGetStringAsync 超时无效
【发布时间】:2015-12-15 14:44:08
【问题描述】:

我有以下代码:

public static string createRequest(string url, int timeout = 1)
{

    Task<string> responseString;

    using (var client = new System.Net.Http.HttpClient())
    {
        responseString = client.GetStringAsync(url);
        responseString.Wait(new TimeSpan(0, 0, timeout));
    }
}

如果我第一次在调试器中运行此代码,超时只会在很长一段时间(1-2 分钟)后发生。第二次运行速度更快,大约 3-4 秒后完成。

如果我在此调用之后在某些代码上设置断点,它有时会运行得更快,但主要是需要很长时间。

为什么即使有定义的超时,代码也需要这么长的时间跨度?

事实上 responseString.StatusTaskStatus.Canceled 这正是我所期望的(没有设备绑定到此 IP)。

这段代码有什么问题?谢谢你:)

【问题讨论】:

  • Wait的返回值是多少?
  • 嗯..添加一个保存返回值的变量会导致超时工作?!

标签: c#


【解决方案1】:

您不应设置Task&lt;string&gt; 对象的超时时间。您必须设置HttpClient.Timeout。另外,请考虑使用async/await 方法:

public static async Task<string> createRequest(string url, int timeout = 1)
{
     using(var client = new HttpClient())
     {
          client.Timeout = TimeSpan.FromSeconds(timeout);
          string response = await client.GetStringAsync(url);

          // Handle response here

          return handledResponse; // You can return a raw string
     }
}

【讨论】:

  • 不把代码封装在另一个函数中就不能等待完成吗?
  • @AllDayPiano 将代码包装在另一个函数中是什么意思?
  • 我只需要从 url 获取数据。我不需要异步执行此操作。整个任务本身(请求和评估返回值)最终将作为任务运行。
  • 为什么不想你想异步执行网络相关任务?我能想到的唯一原因是“这很困难”,但 async/await 消除了这个借口。
  • @AllDayPiano 我想我理解你的担忧。请查看更新的答案。
【解决方案2】:

可能不是最漂亮的版本,但完全符合我的预期:

    public string AsyncRequest(string url, int timeout)
    {
        string retval = null;

        using (var client = new System.Net.Http.HttpClient())
        {
            client.Timeout = TimeSpan.FromSeconds(timeout);
            try
            {
                retval = client.GetStringAsync(url).Result;

                return retval;
            }
            catch
            {
                AllnetALL3073RemoteSwitch_found = false;

                return null;
            }
        }
    }

【讨论】:

  • 如果你同步使用它,我看不到调用异步方法的用途。你正在创造一个无用的开销。
  • 你是对的。我不需要它是异步的。见:stackoverflow.com/questions/34292089/…
猜你喜欢
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多