2016-04-09 9 views
0

私はリポジトリパターンのアプローチでEF 6プロジェクトを持っています。私の他のプロジェクトでC# - IQueryable to ToList非同期 - EF6

private readonly DbContext _ctx = new SomeDbContext(); 

public IQueryable<TEntity> GetAll(bool noTracking = false) 
{ 
    return !noTracking ? _ctx.Set<TEntity>() : _ctx.Set<TEntity>().AsNoTracking(); 
} 

、それが関連するビジネスであるとEntityFramework.dllへの参照を持っていない、それだけでリポジトリのプロジェクトへのアクセス、私は自分のToListAsync拡張メソッドを作りました。

それはTオブジェクトのIQueryableをリポジトリから返さ取り、T.

public static async Task<IList<T>> ToListAsync<T>(this IQueryable<T> query) 
{ 
    return await new Task<IList<T>>(query.ToList); 
} 

使用法のリストに非同期に変換:事はそれだけではないんです

await GetAll(true).Where(<some predicate>).ToListAsync(); 

作業。 debbugerが拡張メソッドにヒットし、それを渡そうとすると、デバッグが停止します。エラーも例外もなく、アプリケーションを完全に停止します。

タスクの作成方法を変更しようとしましたが、進捗はありません。

どうしてですか?

ありがとうございました。

UPDATE

私は、拡張メソッドを変更しましたし、それは明らかに働いた、奇妙な行動がまだそこにあるAltough。

エクステンションメソッドはブレークポイントまたは非同期呼び出し時にのみ実行され、自由に実行できる場合はデバッガ/アプリケーションが終了し、それ以上のコードは実行されません。

作品:、

すべてのこれらのテストは、コンソールアプリケーションで開催されました:

var x = repo.GetAll(true).ToListAsync().Result; 

はない作品(アプリケーションだけで終了します)

var x = await repo.GetAll(true).ToListAsync(); 

UPDATE 2い非同期メソッドwaitに必要です。そうでない場合は、終了します。

MethodX().Wait(); 
+0

なぜリポジトリ内でEFの非同期メソッドを使用しないのですか? –

+0

リポジトリメソッドの戻り値の型を 'IQueryable 'から 'Task >'に変更する必要があります。私のビジネスレイヤーでは、いつリストを返すのではなく、いつリストをクエリに変換するかを選択する柔軟性が必要です。時にはIQueryableだけが必要な場合もあります。しかし、私は何がもっと時間がかかるか分からない:データベースに問い合わせるか、リストで結果を具体化する。 – MurariAlex

答えて

1

作成するタスクは開始されません。まずStart()を呼び出す必要があります。

+0

私はその行を 'return await Task.Run(()=> query.ToList());'に変更しました。 – MurariAlex

0

さて、拡張メソッドを少し変更しました。

return await Task.Run(() => query.ToList()); 

どうやらそれは今働いているが、私は

とにかく感謝...それを試してみたことはほぼ確信しています。

+0

あなたは本当にそこに 'Task.Run'を使いたくありません。これが 'ToList'をもたらしたとすればどんな恩恵がありますか? –

+0

データベース内のエンティティ(IQueryable - > ToList)のマテリアライゼーションは、 'async'を実行しないとUIスレッドをブロックする可能性があります。別のスレッドで実行する必要があります。 AFAIKそれは重い操作です。 – MurariAlex

+0

その場合は、EF依存関係を取り、真の非同期メソッドを使用するか、メソッドを同期として公開し、*呼び出しコードで 'Task.Run'を使用することをお勧めします。現時点では、スレッドプール上で同期コードを実行するだけの非同期シグニチャを持つメソッドを「仮の非同期」にしています。私は[短いブログシリーズ](http://blog.stephencleary.com/2013/10/taskrun-etiquette-and-proper-usage.html)をテーマにしています。 –