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); ??
WebClient.DownloadStringAsync正在使用较旧的基于事件的异步模式(EAP).
WebClient.DownloadStringTaskAsync正在使用较新的基于任务的异步模式(TAP).
由于您的代码已经使用async/ await,我建议您坚持使用TAP方法.TAP代码比EAP代码更易于维护.
您还可以进一步考虑使用HttpClient而不是WebClient.奇怪的命名WebClient是由于它支持同步和EAP,然后更新为包括TAP.相比之下,HttpClient是一种从一开始就基于TAP的新型,因此其API更清晰.
该DownloadStringTaskAsync和DownloadStringAsync文档做既突出的相似性和差异性做得非常好。
它们都是非阻塞的异步方法。但是,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)