2014-12-19 4 views
4

Я следующий кодразница между HttpClient.GetStringAsync и WebClient.DownloadStringAsync

static void Main(string[] args) 
{ 
     string url = "http://www.google.com"; 
     Console.WriteLine(GetUrl(url).Result); // throws TaskCanceledException 
     Console.WriteLine(GetUrl2(url).Result); 
    } 

    public static Task<string> GetUrl(string url) 
    { 
     using (var client = new HttpClient()) 
     { 
      return client.GetStringAsync(url); 
     } 
    } 

    public static Task<string> GetUrl2(string url) 
    { 
     using (var client = new WebClient()) 
     { 
      return client.DownloadStringTaskAsync(url); 
     } 
    } 

Я пытаюсь получить строку с URL, проблема метода GetURL (использует HttpClient-х GetStringAsync) бросает TaskCacelledException, но метод GetUrl2 (использует WebClient DownloadStringTaskAsync) работает правильно. Это вызвано using statement? Что мне не хватает?

Редактировать. В этом примере я вызываю Result для задачи, потому что это консольное приложение, я знаю, что лучше всего ожидать результата в обработчике событий, например.

ответ

6

Это связано с использованием заявления?

Да. В обоих примерах кода вы используете , выставляя базовому клиенту до завершения операции. Оба примера код должен быть изменен, как, например:

public static async Task<string> GetUrlAsync(string url) 
{ 
    using (var client = new HttpClient()) 
    { 
     return await client.GetStringAsync(url); 
    } 
} 

public static async Task<string> GetUrl2Async(string url) 
{ 
    using (var client = new WebClient()) 
    { 
     return await client.DownloadStringTaskAsync(url); 
    } 
} 

Поведение асинхронных загрузки, когда их основные клиенты расположены вне без документов. Лучше не размещать клиентов, пока ваш код не будет выполнен с их помощью.

+0

Так что я не могу рассчитывать на «правильность» примера WebClient? – enrique7mc

+1

@chais: Я бы не стал. Просто используйте 'await', а затем вы * знаете *, он будет работать правильно. –