2017-04-06 11 views
1

すべての変更がデータベースに作られています(多少時間がかかることがあります)、私は待ちたくない、しかしparalellに私が欲しいまでdb.SaveChangesAsync()が待って待っていますので、私のscenaryこのasyncronous EFでSaveChangesAsync()を待つことは必須ですか?

//a lot of database dependant processing 

db.SaveChangesAsync(); //asynchronouly saving database changes 

//a lot of ANOTHER long term database INDEPENDANT stuff 

のようなものですWHILE SaveChangesの下にある他のログ用語を変更を保存するには、なぜ私はawaitを使用する必要がありますか?もし私が使用するのをやめなければ、私は下の画像で心配しています。 enter image description here

+0

私はあなたが 'await'が実際にここでやっていることを理解しているとは思わない。あなたがそれを待たずに済むと、実際に仕事をする前に終了するかもしれません。また、 'await'はメソッドが次の行に移動する前に完了するのを待つことを意味しません。 – DavidG

+0

私は、パラレルと非同期という2つの異なるコンセプトを混在させていたと思います。私はこのスレッドを読んでいたhttp://stackoverflow.com/questions/4844637/what-is-the-difference-between-concurrency-parallelism-and-asynchronous-methodsどのように私はWindowsフォームアプリケーションでいくつかの応答性を得ることができる把握する。しかし、私はまだasp.net MVCアプリケーションで何らかのパフォーマンスを得ることができるかどうかを判断できません。 –

答えて

2

この警告は非常に明確である - あなたは非同期タスクを開始しているが、あなたはそれが完全なときに通知されるためのメカニズムを持っていません。もしあなたがなら、はそれがいつ終わったかを知る必要がありますか?あなたの方法から戻る前に、またはデータがDBと同期していることを確認する必要がある時点で?

await操作は、データを保存している間は、独立した処理を停止したくないことを保証するための1つの方法です。 awaitは非同期であり、並列性ではありません。

さらに、保存タスクを実行すると、DBによってスローされた例外を確実にキャッチできます。単純にタスクを解放すると例外が失われます。例外的に例外をスローする観察されないタスクを処理するには、最高でもTaskScheduler.UnobservedTaskExceptionを処理できますが、単純にを参照してタスクを観察してください。

あなたが知っているように、タスクを観察する1つの方法はawaitです。もう一つは、SaveChangesAsyncが変数に返すTaskオブジェクトを単に保存することです。これにより、後でそのタスクのawait(またはWait())に例外が発生します(awaitコールを試すか捕まえるか、またはタスクにContinueWithをつけることによって)、コンパイラはあなたがそのタスクを放棄していないことを容易に知ることができます。仕事はその運命へ:

//a lot of database dependant processing 
var dbSaveTask = db.SaveChangesAsync(); //asynchronouly saving database changes 
//a lot of ANOTHER long term database INDEPENDANT stuff 
// now, before assuming the DB is up to date, ensure the TAsk is complete. 
await dbSaveTask; 
// now do something Db-dependent! 
+0

'await'はデータベースの更新エラーを検出することもできます。それがなければ、アップデートが失敗するかどうかはわかりません。 –

+0

さて、あなたはタスクにContinuationを付けて、返されたAggregateExceptionを調べることができます。 –

+1

(これは 'await'のことです) 私が作ろうとしたのは、op *が返されたタスクを破棄すると、失敗の知識がないということでした。 –

関連する問題