2012-09-19 43 views
6

新しいC#5でL2Sを使用するベストプラクティスはthisのアプローチと比較してキーワードがasync/awaitですか?ウェブ上で何も見つかりませんでした。新しいasync/awaitと非同期にLinqを使用する

+0

ラッパーなどを作成することは可能でしょうか? Btw、最新のEFはasync/awaitをサポートしていますか? – UserControl

答えて

6

EF 5にはasync/awaitサポートはありませんが、オープンソース版ではここで可能性を検討しています。編集:EFでの非同期サポートはhttp://msdn.microsoft.com/en-us/data/jj819165.aspxに記載されています。 (RXで見つけたように)水和された結果をストリームしませんが、データベース呼び出しを非同期にします。

LINQ to SQLに関しては、Task.Factory.Start操作でリクエストをラップする以外に、非同期(非同期/待機用に必要)タスクがLinq用に実装されることを望んでいませんSQLへ。

絶対に必要な場合は、IQToolkitを使用して、独自の非同期サポートを追加して拡張することができます。また、MonoはLINQ to SQLを実装しており、非同期サポートで拡張することができます。

3

Scott Hanselmanはinteresting postを持っており、既存のLinq to SQLクエリの上に非同期APIを生成する方法を示しています。私はこのアイデアを持ちすぎずにいますが、同じテクニックをIQueryableやIEnumerable型のオブジェクトに拡張できる汎用的な拡張メソッドを作ることができると推測しています。

ここには彼の投稿から直接参照として使用するコードがあります。

SqlCommand _beginFindCmd = null; 

public IAsyncResult BeginFind(int id, AsyncCallback callback, Object asyncState) 
{ 
    var query = from w in _db.Widgets 
       where w.Id == id 
       select w; 
    _beginFindCmd = _db.GetCommand(query) as SqlCommand; 
    _db.Connection.Open(); 
    return _beginFindCmd.BeginExecuteReader(callback, asyncState, System.Data.CommandBehavior.CloseConnection); 
} 

public Widget EndFind(IAsyncResult result) 
{ 
    var rdr = _beginFindCmd.EndExecuteReader(result); 
    var widget = (from w in _db.Translate<Widget>(rdr) 
        select w).SingleOrDefault(); 
    rdr.Close(); 
    return widget; 
} 

少しの作業で、このTPLを作成し、同様に単一の非同期メソッドとしてより洗練されたものにすることができます。ちょうどこれをする機会があれば、私が思いつくものを投稿します。

関連する問題