2017-01-12 2 views
-1

の非同期メソッドを使用して私の知る限りasyncsync方法を消すために把握するためにしてきた:ではなく、同期1

private async void RefreshScreen() 
{ 
    await System.Threading.Tasks.Task.Run(() => 
     { 
      this.refreshContent(); 
      this.refreshTokens(); 
     } 
    ); 
} 

は、より多くのを使用してそれを得るために、とにかくそこではないですエレガントな方法?あなたが把握することができたよう

EDIT

RefreshContent()RefreshTokens()は、Webサービスには、いくつかの呼び出しに従事しています。現在

public async System.Threading.Tasks.Task<string> GetUrlAsync() 
{ 
    ApiResponse<string> localVarResponse = await GetUrlAsyncWithHttpInfo(); 
    return localVarResponse.Data; 
} 

public string GetUrl() 
{ 
    ApiResponse<string> localVarResponse = GetUrlWithHttpInfo(); 
    return localVarResponse.Data; 
} 

、我々は"sync"メソッドを使用していて、確かに、私たちはasync呼び出しを使用して移動したい:

このWebサービスクライアントの実装では、メソッドを呼び出すためsyncasync方法を提供しています。

例:

public Enumerable<Element> GatherElements() 
{ 
    return yield new Element() { 
     Field1 = RESTClient.GetMethod1(), 
     Field2 = RESTClient.GetMethod2(), 
     Field3 = RESTClient.GetMethod3(), 
     Field4 = RESTClient.GetMethod4(), 
     Field5 = RESTClient.GetMethod5(), 
     Field6 = RESTClient.GetMethod6(), 
     Field7 = RESTClient.GetMethod7() 
    }; 
} 

私は関係なく、各Fieldがfullfilledされているかどうかのすべての要素を返すようにしたい、すべての残りのコールが完了するまで待機する必要はありません。

私がうまく説明したかどうかわかりません。

+6

イベントハンドラでない場合は 'void'の代わりに' Task'を使います。 –

+0

なぜ 'void'の代わりに' Task'を使うのが適していますか?どんなサンプルも提供できますか? – Jordi

+2

サンプル: 'Task.Run'の中に' throw new Exception() 'を置き、' RefreshScreen'をどこかで実行してください。例外がスローされなかったことに気付きました。 – Fabio

答えて

3

"後方に"問題に近づいています。 「このメソッドを非同期化する」方法を理解しようとするのではなく、もう一方の端から開始する必要があります。

たとえば、refreshContentは何をしますか?おそらくウェブAPIやデータベースにぶつかるI/Oが遅いのですか?次に、それらの低レベルのWeb /データベース呼び出しから始めます。それらを非同期にする最初にHttpClientとEntity Frameworkの両方にビルトイン非同期サポートがあります)。その後awaitこれらの通話は、そこからasyncになります。

asyncを追加すると、戻り値の型をTask/Task<T>に変更することをおすすめします。他の人が指摘したように、あなたはavoid async voidです。オフロードする必要のあるCPUの重い操作をしていない限り、Task.Runを使用する必要もありません。

最終的にはasync Task RefreshScreenになります。async voidイベントハンドラから呼び出すことができます。

+0

私は投稿を編集しました。私はもう一つのアプローチから問題を提起しました.... – Jordi

関連する問題