我正在开发一个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); ??
答案 0 :(得分:8)
WebClient.DownloadStringAsync
正在使用较旧的event-based asynchronous pattern (EAP)。
WebClient.DownloadStringTaskAsync
正在使用较新的task-based asynchronous pattern (TAP)。
由于您的代码已使用async
/ await
,我建议您坚持使用TAP方法。 TAP代码比EAP代码更易于维护。
您还可以进一步考虑使用HttpClient
代替WebClient
。 WebClient
中的奇怪命名是由于它支持同步和EAP,然后更新为包括TAP。相比之下,HttpClient
是一种从一开始就基于TAP的新类型,因此其API更清晰。
答案 1 :(得分:5)
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;
}
或者,您也可以只返回任务,以便您可以继续其他操作,而无需等待返回的异步方法:
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;
}