2017-02-01 4 views
0

これはクエリです:私はToListToListAsyncを交換した場合ToListAsyncを使用したEFクエリがWPFアプリケーションでハングするのはなぜですか?

using (var db = new AppDbContext()) 
{ 
    var items = await db.Branches 
     .Where(b => b.OrgId == orgId) 
     .Select(t => new SelectListItem<int> {Key = t.Id, Value = t.Name}) 
     .ToListAsync(); 
    return items; 
} 

、それが正常に動作しますが、それ以外の場合は、ハングアップします。私はある種のスレッド問題を疑う。

public override async void OnNavigatedTo(NavigationContext navigationContext) 
{ 
    await InitializeModelAsync(InitModelCts.Token); 
} 

これはINavigationAwareのビューの実装の一部です:クエリは、ビュー内の「イベント」から呼び出された私のviewmodelのInitializeAsync方法、中に呼び出されます。

+2

これは役に立つかもしれません:[ToListAsync()は完全に完了しません](http://stackoverflow.com/a/25899982/6741868) –

+0

どちらの場合もThreadIdを確認してください。それらが異なる場合は代わりにディスパッチャーを使用してください – Ramankingdom

+0

'OnNavigatedTo'は最初から' async'ではないからでしょうか?私は[このブログ](https://invokeit.wordpress.com/2012/10/15/async-await-and-onnavigatedto-wpdev-win8dev/)を見つけました。 – smoksnes

答えて

1

あなたがConfigureAwaitメソッドを呼び出すことによって、コンテキストをキャプチャしていない場合、それは動作しません?:

using (var db = new AppDbContext()) 
{ 
    var items = await db.Branches 
     .Where(b => b.OrgId == orgId) 
     .Select(t => new SelectListItem<int> { Key = t.Id, Value = t.Name }) 
     .ToListAsync().ConfigureAwait(false); 
    return items; 
} 

また初期Entity Frameworkのセットアップが実際に非同期ではない点に注意してください。

EF6 ToListAsync freezes Winforms

...クエリとコンテキスト作成全体をバックグラウンドスレッドにオフロードしたいかもしれません:

+0

'ToListAsync'のように、' SynchronizationContext.Post'を使って解決しました。 – ProfK

関連する問題