2015-12-15 3 views
-2

У меня есть следующий код:GetStringAsync тайм-аут не имеет никакого эффекта

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.Status является TaskStatus.Canceled это именно то, что я не ожидал (нет устройства, связанного с этим IP).

Что не так с этим кодом? Спасибо :)

+1

Что такое возвращаемое значение 'Wait'? – dman2306

+0

Хм .. добавление переменной, удерживающей возвращаемое значение, заставляет тайм-аут работать ?! – AllDayPiano

ответ

2

Нельзя устанавливать тайм-аут объекта Task<string>. Вы должны установить 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 
    } 
} 
+0

Невозможно дождаться окончания, не обернув код другой функцией? – AllDayPiano

+0

@AllDayPiano Что вы имеете в виду, обертывая код в другой функции? –

+0

Мне просто нужно получить данные с URL-адреса. Мне не нужно делать это асинхронно. Сама задача (запрос и оценка возвращаемого значения), наконец, будет выполняться как задача. – AllDayPiano

0

не самый Beautyful варианта, но именно делать то, что я ожидал:

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; 
      } 
     } 
    } 
+0

Я не вижу использования вызова асинхронного метода, если вы используете его синхронно. Вы создаете бесполезные накладные расходы. –

+0

Вы правы. Мне не нужно, чтобы это было асинхронно. См. Http://stackoverflow.com/questions/34292089/getstringasync-timeout-has-no-effect/34306663?noredirect=1#comment56327524_34292346 – AllDayPiano

Смежные вопросы