8

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

4

2 に答える 2

6

EF 5 には async/await のサポートはありませんが、オープン ソース バージョンでは積極的に可能性を探っています。編集: EF での非同期サポートは、http://msdn.microsoft.com/en-us/data/jj819165.aspx で文書化されています。結果がハイドレートされているため (RX で見られるように)、結果をストリーミングしませんが、データベース呼び出しを非同期にします。

LINQ to SQL に関しては、Task.Factory.Start 操作でリクエストをラップする以外に、タスク ベースの非同期 (async/await に必要) が Microsoft によって Linq to SQL 用に実装されることを願っています。

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

于 2012-09-19T17:48:48.590 に答える
3

Scott Hanselman の興味深い投稿があり、既存の 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 を作成し、同様に単一の非同期メソッドとしてよりクリーンにすることができます。これを行う機会があれば、私が思いついたものを投稿します。

于 2013-10-14T05:07:21.637 に答える