这里我有两种不同的方法来定义和调用异步任务方法
1。
using System.IO;
using Newtonsoft.Json;
using System.Net.Http;
using System.Threading.Tasks;
namespace foo{
public class bar{
public bar(){
LoadData();
}
private async void LoadData(){
var data=await getData<List<string>>("http://foobar.com/city");
}
private Task<T> getData<T>(string url){
return Task.Run(async()=>{
try{
var client=new HttpClient();
var response=await client.GetAsync(url);
response.EnsureSuccessStatusCode();
using(var reader=new StreamReader(await response.Content.ReadAsStreamAsync())){
var data = JsonConvert.DeserializeObject<T>(await reader.ReadToEndAsync());
return data;
}
}catch(Exception){}
return default(T);
});
}
}
}
2。
using System.IO;
using Newtonsoft.Json;
using System.Net.Http;
using System.Threading.Tasks;
namespace foo{
public class bar{
public bar(){
LoadData();
}
private async void LoadData(){
var data=await getData<List<string>>("http://foobar.com/city");
}
private async Task<T> getData<T>(string url){
try{
var client=new HttpClient();
var response=await client.GetAsync(url);
response.EnsureSuccessStatusCode();
using(var reader=new StreamReader(await response.Content.ReadAsStreamAsync())){
var data = JsonConvert.DeserializeObject<T>(await reader.ReadToEndAsync());
return data;
}
}catch(Exception){}
return default(T);
}
}
}
getData
方法中这些差异。 1只使用Task
和2.使用async Task
这些都按预期正常运行,但这是正确的还是最好的使用方法?
请给出一些解释
答案 0 :(得分:0)
在方法1中,您明确地创建了一个Task
,其中包含运行它的所有开销,并使用它来等待其他任务。
方法2是可行的方法,因为您不会创建额外Task
的不必要开销。
此外,除非您确切知道自己在做什么,否则不要使用async void
- Async/Await - Best Practices in Asynchronous Programming