2017-08-27 14 views
2

this questionを読んだことがありますが、Resultプロパティを使用する必要がないため、私の場合は簡単です。だから私はスティーブン・クレアリーの答えより簡単なアプローチで行くことができるのだろうかと思っていた。タスクをタスク<T>に変換する(返品タイプがTのラップタスク)

私はこの単純なインターフェースを持っているとします。

このインターフェイスは、オブジェクトを非同期にロードするためのメソッドを提供します。ロード結果がオブジェクト自体であるため、何も戻されません。

(インターフェイスが内部であり、そのため、実装の公開を回避するために明示的に実施。)

ここでは、私はバイナリデータをロードする方法です。

data = new BinaryData(); 
await ((IBinaryDataReadable)data).Load(reader); 

私は、これは、より流暢と冗長ようにしたいので、私はこの拡張方法

internal static Task<TData> Load<TData>(this TData data, AsyncDataReader reader) 
    where TData : IBinaryDataReadable 
     => data.Load(reader).ContinueWith(t => data, TaskContinuationOptions.ExecuteSynchronously); 

今すぐ読み込み、書き込みは次のようになります。

data = await new BinaryData().Load(reader); 

ここでは、このメソッドの使用について心配する必要がありますか?たとえば例外処理などですか?非同期を使用して行うことができ

答えて

4

のTh同じ/待つとContinueWith

internal static async Task<TData> Load<TData>(this TData data, AsyncDataReader reader) 
    where TData : IBinaryDataReadable { 
    await data.Load(reader); 
    return data; 
} 

あなたも、必要に応じてメソッド内で例外処理を含めることができますこの方法を使用して見送ります。 しかし、拡張メソッドは、メソッドが待たなければならないタスクを返すので、流暢なインターフェイスの点ではあまり効果がありません。

そして、ジェネリック拡張を明示的に呼び出す必要があります。それ以外の場合は、コンパイルエラーが発生するのを待ってvoidに解決するタイプのローカルメンバーを呼び出すだけです。

data = await new BinaryData().Load<BinaryData>(reader); 

拡張メソッドの名前を、インターフェイス上の既存のメンバーと衝突しないように変更することをお勧めします。

data = await new BinaryData().LoadAsync(reader); 

私はContinueWithの使用は、私はそれが例外を囲いすることができない以外は何の問題も導入表示されない問題

を紹介するかどうかを知りたいと思いました。しかし、それはその事件をチェックし、それをバブリングすることによって管理することができます。

internal static Task<TData> LoadAsync<TData>(this TData data, AsyncDataReader reader) 
    where TData : IBinaryDataReadable { 
    return data.Load(reader) 
     .ContinueWith(t => { 
      var error = t.Exception; 
      if (error != null && t.IsFaulted) 
       throw error; 
      return data; 
     }, TaskContinuationOptions.ExecuteSynchronously); 
} 

私の意見では、async/awaitを使用することは、よりクリーンで読みやすく、実装することができました。

+0

ありがとうございました。 async/awaitの使用を避ける理由は、非常に基本的なタスクのための状態マシンオーバーヘッドの生成を防ぐことでしたが、これはContinueWithの使用が問題を引き起こすかどうかを知りたかった良い解決策です。 –

+1

@ M.kazemAkhgary、いいえ、例外を摘出できないということを除いては何の問題も導入していません – Nkosi

関連する問題