2015-09-04 2 views
2

Я работаю над веб-приложением asp.net mvc5, и я не уверен, в чем разница между использованием DownloadStringTaskAsync() & с использованием DownloadStringAsync(). например, если у меня есть следующий WebClient: -Разница между DownloadStringTaskAsync & DownloadStringAsync

using (WebClient wc = new WebClient()) 
{ 
    string url = currentURL + "home/scanserver?tokenfromtms=" + "12345" + "&FQDN=allscan" ; 
    var json = await wc.DownloadStringTaskAsync(url); 
    TempData["messagePartial"] = string.Format("Scan has been completed. Scan reported generated");     
} 

будет ли какое-либо различие, если я chnage DownloadStringTaskAsync (URL); к DownloadStringAsync (url); ??

ответ

3

Документация DownloadStringTaskAsync и DownloadStringAsync делают довольно хорошую работу, выделяя как сходства, так и различия.

Оба они являются неблокирующими, асинхронными методами. Однако DownloadStringAsync имеет обратную подпись void и требует, чтобы вы прослушали событие DownloadStringCompleted, чтобы получить результаты от результата, тогда как метод DownloadStringTaskAsync возвращает Task<string>.

Последнее полезно, если у вас есть параллельные асинхронные операции, которые вам нужно ждать, прежде чем продолжить, или если вы хотите позвонить ContinueWith о выполнении операции после ее завершения. Кроме того, с последним вам также нужно будет получить результат из задачи, как только задача будет в состоянии завершения, которое можно распаковать с ожиданием.

И, наконец, DownloadStringAsync требует URI, тогда как DownloadStringTaskAsync примет строку.

Для простоты использования, DownloadStringTaskAsync вероятно, будет работать нормально, при условии, что вы поместили его в метод асинхронной следующим образом:

void Main() 
{ 
    using (WebClient wc = new WebClient()) 
    { 
     var json = GetGoogleFromTask(wc);     
     json.Dump(); 
    } 
} 

public async Task<string> GetGoogleFromTask(WebClient wc) 
{ 
    string url = "http://www.google.com" ; 
    var json = await wc.DownloadStringTaskAsync(url); 
    return json; 
} 

Кроме того, вы также можете вернуть только Задачу, так что вы можете продолжить другие операции без необходимости метод асинхронной, который ждет возвращения:

void Main() 
{ 
    using (WebClient wc = new WebClient()) 
    { 
     var json = GetGoogleFromTask(wc);     
     json.Dump(); 
    } 
} 

public Task<string> GetGoogleFromTask(WebClient wc) 
{ 
    string url = "http://www.google.com" ; 
    var json = wc.DownloadStringTaskAsync(url); 
    return json; 
} 
+0

Не уверен, что я получил вашу точку, поэтому какая задача «DownloadStringTaskAsync» вернется. Например, если я звоню в веб-службу, которая вернет json, так как я могу работать с возвратом json-объекта в качестве задачи? извините за задание много вопросов !! –

+0

@johnG Я уточнил свой ответ, так как поведение DownloadStringAsync не совсем то, чего я ожидал. Я также добавил примеры использования DownloadStringTaskAsync. –

+2

Упростительно, всякий раз, когда вы видите версии метода '* Async' и' * TaskAsync' метода, это означает, что версия '* Async' предшествовала внедрению async-ожидания в C# и использовала шаблон, созданный для создания аналогичного эффекта. Методы 'TaskAsync' были добавлены после асинхронного ожидания и использования async-ожидания. Предыдущие методы остаются для обратной совместимости. –

7

WebClient.DownloadStringAsync использует старшее event-based asynchronous pattern (EAP).

WebClient.DownloadStringTaskAsync is the newer task-based asynchronous pattern (TAP).

Поскольку ваш код уже использует async/await, я рекомендую вам придерживаться метода TAP. Код TAP более удобен, чем код EAP.

Вы также можете пойти еще на один шаг и рассмотреть возможность использования HttpClient вместо WebClient. Нечетное присвоение имен в WebClient связано с его поддержкой как синхронного, так и EAP, а затем позже обновляется, чтобы включить TAP. Напротив, HttpClient - это более новый тип, основанный на TAP с самого начала, поэтому его API является более чистым.

+0

спасибо за ответ. но в обоих случаях iis будет ждать получения строки (загрузить строку) перед продолжением выполнения? это верно??. например, в методе действия (я написал в моем исходном вопросе), я никогда не закончу доступ к «TempData [" messagePartial "] = string.Format (« Сканирование завершено. Сканирование сгенерировано »); если веб-клиент заканчивает выполнение (strinf полностью загружен) ... либо с использованием «downloadstringasync», либо с помощью «downloadstringtaskasync», это правильно? –

+0

Да, так работает async. Я рекомендую вам ознакомиться с опубликованным мной сообщением, в котором дается общий обзор того, как работает асинхронный процесс, и делает небольшой миф о том, что многие думают, что это так, а это не так. http://cpratt.co/async-not-faster/ –

+2

@johnG: 'await' приостанавливает ваш текущий метод до тех пор, пока не будет загружена строка. Версия EAP ('DownloadStringAsync') не может быть' await'ed, поэтому ваш метод продолжает выполняться сразу во время загрузки, и веб-клиент уведомляет вас о завершении загрузки через 'DownloadStringCompleted'. Обратите внимание, что код 'await' намного проще писать и поддерживать, чем код обработки событий. –

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