2012-11-14 18 views
10

.NET 4.0のawaitキーワードの最良の代替方法は何ですか?非同期操作の後に値を返す必要があるメソッドがあります。私はwait()メソッドがスレッドを完全にブロックし、非同期操作が役に立たないことに気付きました。 UIスレッドを解放しながら非同期操作を実行するためのオプションは何ですか?.NET 4.0の代替案を待ち望んでいますか?

+1

私はそう思っています。いくつかのコードがありますか? – lboshuizen

+3

.net 4.0をターゲットにしている間にC#5.0でVS2012を使用することは可能ですか? [Using async-await on .net 4](http://stackoverflow.com/questions/9110472/using-async-await-on-net-4)を参照してください。 – CodesInChaos

+0

@CodesInChaos同僚の場合は、:)。 – Dante

答えて

4

私はReactive Extensions

を使用する最も簡単な方法は、インストールするには、おそらく非同期CTPasync/await

  • を使用Task.ContinueWith()
  • を使用して、あなたの基本的なオプションが

    • だと思います非同期CTP。私の知る限り、ライセンスは商業的な使用を許可します。コンパイラにパッチを当て、あなたのプロジェクトに含めることができる150kbのDLLが付属しています。

      Task.ContinueWith()を使用できます。しかし、それは、例外処理とフロー制御でいくらか努力する必要があるということです。

      タスクは機能的な構造です。そのため、ContinueWith()は、forループやtry-catchブロックのような必須の構造とうまく混合できません。したがって、asyncawaitが導入されたので、コンパイラが私たちを助けることができます。

      コンパイラをサポートできない場合(つまり、.Net 4.0を使用している場合)は、TAPを機能フレームワークとともに使用することをおすすめします。 Reactive Extensionsは、非同期メソッドを処理するための非常に優れたフレームワークです。

      "reactive extensions tasks"を開始するにはgoogleを使用してください。

  • 1

    yieldコルーチンでawaitのような動作を実装できますが、これは4.5以外のコードで使用しています。そして、あなたがYieldInstructionのいくつかの実装を必要とする(TaskCoroutine AEタスクを処理する)、この方法(擬似コード)、それを使用

    public abstract class YieldInstruction 
    { 
        public abstract Boolean IsFinished(); 
    } 
    

    :あなたは非同期に実行するメソッドから取得されYieldInstructionクラスが必要

    public IEnumerator<YieldInstruction> DoAsync() 
    { 
        HttpClient client = ....; 
        String result; 
        yield return new TaskCoroutine(() => { result = client.DownloadAsync(); }); 
        // Process result here 
    } 
    

    ここでは、命令の実行を処理するスケジューラが必要です。

    for (Coroutine item in coroutines) 
    { 
        if (item.CurrentInstruction.IsFinished()) 
        { 
         // Move to the next instruction and check if coroutine has been finished 
         if (item.MoveNext()) Remove(item); 
        } 
    } 
    

    あなたはまた、あなたが適切なタイミングでコルーチンを更新している場合は任意のInvoke呼び出しを避けることができますWPFやWinFormsのアプリケーションを開発します。また、あなたの人生をより簡単にするためにアイディアを広げることもできます。サンプル:

    public IEnumerator<YieldInstruction> DoAsync() 
    { 
        HttpClient client = ....; 
        client.DownloadAsync(..); 
    
        String result; 
        while (client.IsDownloading) 
        { 
         // Update the progress bar 
         progressBar.Value = client.Progress; 
         // Wait one update 
         yield return YieldInstruction.WaitOneUpdate; 
        } 
        // Process result here 
    } 
    
    関連する問題