Xamarin异步任务启动

时间:2017-03-31 04:29:31

标签: c# asynchronous xamarin task

这里我有两种不同的方法来定义和调用异步任务方法

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 这些都按预期正常运行,但这是正确的还是最好的使用方法?
请给出一些解释

1 个答案:

答案 0 :(得分:0)

在方法1中,您明确地创建了一个Task,其中包含运行它的所有开销,并使用它来等待其他任务。

方法2是可行的方法,因为您不会创建额外Task的不必要开销。

此外,除非您确切知道自己在做什么,否则不要使用async void - Async/Await - Best Practices in Asynchronous Programming