DownloadStringTaskAsync和DownloadStringAsync之间的区别

joh*_* Gu 4 .net c# asp.net entity-framework asp.net-mvc-5

我正在使用asp.net mvc5 Web应用程序,我不确定使用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");                 
 }
Run Code Online (Sandbox Code Playgroud)

如果我chnage DownloadStringTaskAsync(url)会有任何差异; to DownloadStringAsync(url); ??

Ste*_*ary 9

WebClient.DownloadStringAsync正在使用较旧的基于事件的异步模式(EAP).

WebClient.DownloadStringTaskAsync正在使用较新的基于任务的异步模式(TAP).

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

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

  • @johnG:`await`将暂停当前方法,直到下载字符串.EAP版本(`DownloadStringAsync`)不能被"等待",因此您的方法在下载过程中立即继续执行,并且Web客户端通过`DownloadStringCompleted`通知您下载完成.请注意,`await`代码比事件处理代码更容易编写和维护. (2认同)
  • @johnG:您*可以*将EAP成员包装在TAP包装器中,并等待该任务.但这样做毫无意义,因为`DownloadStringTaskAsync`已经做到了. (2认同)

Dav*_*d L 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;
}
Run Code Online (Sandbox Code Playgroud)

另外,您也可以只返回Task,这样就可以继续其他操作,而无需等待返回的异步方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 简而言之,每当您看到方法的`* Async`和`* TaskAsync`版本时,这意味着`* Async`版本早于在C#中引入async-await,并使用事件模式来实现类似的效果。在异步等待之后添加了* TaskAsync`方法,并利用了异步等待。先前的方法仍然是向后兼容的。 (2认同)