2016-05-25 1 views
0

私は以前はブラウザベースのアプリケーションで作業していました。 Angular simple repositoryなどがあります。C#(xamarin)でリクエストを非同期にするには?

function getSomeData(params) { 
     ... 
     return $http({ 
      url: conf.urlDev + 'some/rest-url', 
      method: "GET", 
      params: params, 
      cache: true 
     }).then(getDataComplete); 

     function getDataComplete(response) { 

      return response.data; 
     } 
    } 

c#(XAMARINなど)では同じように見えますか? 私は試してみてください。私のサービスで

public class BaseClient 
{ 
    protected Http _client = null; 
    protected string _urlObj; 
    protected string _basePath; 

    public BaseClient() 
    { 
     _client = new Http(new HttpClientHandler()); 
    } 

    public string Path 
    { 
     set 
     { 
      _urlObj = value; 
     } 
    } 

    public async Task<Result<IList<T>>>getList<T>(Dictionary<string,object> parametrs = null) 
    { 
     if (parametrs != null) 
     { 
      foreach(KeyValuePair<string, object> keyValue in parametrs) 
      { 
       _urlObj = _urlObj.SetQueryParam(keyValue.Key, keyValue.Value); 
      } 
     } 

     var response = await _client.GetAsync(_urlObj.ToString()); 

     if (response.IsSuccessStatusCode) 
     { 
      return new Result<IList<T>>() 
      { 
       Success = true, 
       Value = JsonConvert.DeserializeObject<IList<T>>(await response.Content.ReadAsStringAsync()) 
      }; 
     } 
     else 
     { 
      var error = new Result<IList<T>>() 
      { 
       Error = response.StatusCode.ToString(), 
       Message = response.ReasonPhrase, 
       Success = false 
      }; 

      return error; 
     } 
    } 

public async Task<IList<News>> GetAllNewsByParams(DateTime from, 
          string orderBy = "-published", 
          DateTime to = new DateTime(), 
          int page = 1, int category = 0) 
    { 
     _client.Path = _config.NewsPath; 

     var dict = new Dictionary<string, object> { 
      {"from", from.ToString("s")}, 
      {"order_by", orderBy.ToString()}, 
      {"to", to.ToString("s")}, 
      {"page", page.ToString()} 
     }; 

     if (category != 0) 
     { 
      dict.Add("category", category.ToString()); 
     } 

     var res = await _client.getList<News>(dict); 

     return res.Value; 
    } 

とイムNYのviewmodel

foreach (var item in await _newsService.GetAllNewsByParams(
             _To, 
             _OrderBy, 
             _From, _Page, 
      selectedTag == null ? _SeletedNewsTagId : selectedTag.Id)) 
     { 
      NewsList.Add(item); 
     } 

は彼のクエリは、同期的に実行されていますか? どのように非同期にするのですか?

+1

非同期で*応答を待っている間スレッドを占有していない場合*、はい、操作は純粋に非同期です。 –

+0

つまり、そうしてはいけません。({})? – bleggleb

+1

'async' /' await'は、コールバックベースの非同期操作を抽象化したもので、 'then'コールバックは単に' await'行のすべてのものとして見ることができます。 –

答えて

1

まず、RestSharpを使用することを本当にお勧めします.HTTPリクエストを単純化してデシリアライズします。プロジェクトにRestSharp nuget packageを追加します。あなたのコードがRestSharpを使用するように見える方法は次のとおりです。

public class BaseClient 
{ 
    protected IRestClient _client = null; 
    protected string _urlObj; 
    protected string _basePath; 

    public BaseClient() 
    { 
     _client = new RestClient(); 
    } 

    public async Task<Result<IList<T>>> GetList<T>(string path, Dictionary<string, object> parametrs = null) 
    { 
     var request = new RestRequest(path, Method.GET); 
     if (parametrs != null) 
     { 
      foreach (var keyValue in parametrs) 
      { 
       request.AddQueryParameter(keyValue.Key, keyValue.Value); 
      } 
     } 

     var response = await _client.Execute<List<T>>(request); 

     if (response.IsSuccess) 
     { 
      return new Result<IList<T>>() 
      { 
       Success = true, 
       Value = response.Data 
      }; 
     } 
     else 
     { 
      var error = new Result<IList<T>>() 
      { 
       Error = response.StatusCode.ToString(), 
       Message = response.StatusDescription, 
       Success = false 
      }; 

      return error; 
     } 
    } 
} 
あなたのサービスで

public async Task<IList<News>> GetAllNewsByParams(DateTime from, 
         string orderBy = "-published", 
         DateTime to = new DateTime(), 
         int page = 1, int category = 0) 
    { 

     var dict = new Dictionary<string, object> { 
         {"from", from.ToString("s")}, 
         {"order_by", orderBy.ToString()}, 
         {"to", to.ToString("s")}, 
         {"page", page.ToString()} 
        }; 

     if (category != 0) 
     { 
      dict.Add("category", category.ToString()); 
     } 

     var res = await _client.GetList<News>(_config.NewsPath, dict); 

     return res.Value; 
    } 

そして、あなたのviewmodelで

var news = await _newsService.GetAllNewsByParams(
            _To, 
            _OrderBy, 
            _From, _Page, 
      selectedTag == null ? _SeletedNewsTagId : selectedTag.Id); 
foreach (var item in news) 
{ 
    NewsList.Add(item); 
} 

これは100%非同期になります。

関連する問題