DownloadStringTaskAsync& DownloadStringAsync

时间:2015-09-04 16:49:31

标签: c# asp.net .net entity-framework asp.net-mvc-5

我正在开发一个asp.net mvc5网络应用程序,我不确定使用DownloadStringTaskAsync()和&使用DownloadStringAsync()。例如,如果我有以下webclient: -

 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)会有任何差异; to DownloadStringAsync(url); ??

2 个答案:

答案 0 :(得分:8)

WebClient.DownloadStringAsync正在使用较旧的event-based asynchronous pattern (EAP)

WebClient.DownloadStringTaskAsync正在使用较新的task-based asynchronous pattern (TAP)

由于您的代码已使用async / await,我建议您坚持使用TAP方法。 TAP代码比EAP代码更易于维护。

您还可以进一步考虑使用HttpClient代替WebClientWebClient中的奇怪命名是由于它支持同步和EAP,然后更新为包括TAP。相比之下,HttpClient是一种从一开始就基于TAP的新类型,因此其API更清晰。

答案 1 :(得分:5)

DownloadStringTaskAsyncDownloadStringAsync文档可以很好地突出相似之处和差异。

它们都是非阻塞的异步方法。但是,DownloadStringAsync的返回签名为void,要求您收听DownloadStringCompleted事件以从Result获取结果,而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;
}