3

我想ObjectContext(贏的應用程序)的SaveChanges異步保存更改,將顯示一個選取框(或可控?)進度條(這個我可以很容易地實現)的用戶,而他能繼續工作。Asynchronous ObjectContext.SaveChanges()?

我基本上要覆蓋ObjectContextSaveChanges

以前有沒有人想過這個?

+0

您應該將此問題標記爲* .net *。這會增加可見性,並且您可能會得到更多答案。 – jpbochi 2009-08-04 14:11:03

+0

不幸的是,沒有超過5個標籤的地方。 我認爲其他標籤已經是.net。 – Shimmy 2009-12-31 07:59:05

回答

2

編輯在2013年3月12日:

由於一些人開始downvote這個答案,我想的是,由於某種原因,這個解決方案是不好了。

請不要因此而降低答案。總是從一個溫和的評論開始,說你爲什麼不喜歡答案。我想你需要使用Asynchronous Delegates。它基本上可以這樣工作:

  1. 您可以通過想要異步調用的方法創建委託;

  2. 您對委託調用BeginInvoke,開始呼叫;

  3. 你做你需要做的(例如動畫選取框)任何其他人;

  4. 您可以等待異步調用來完成,或者檢查是否已完成,並保持動畫字幕如果不是;

+4

我知道這個問題(和答案)是相當古老的,但我偶然發現它,我想我會添加一些東西:你的解決方案不是很有趣的資源明智。我們希望在DB調用期間使用異步模式來允許當前線程在IO操作期間被釋放(並且最終被重用)。如果使用委託,它將從阻塞IO操作(SaveChange)時將被阻塞的線程池中啓動一個線程。這意味着性能明智的異步委託在這種情況下是無用的:不要在Web服務器上使用此實現。 – Eilistraee 2011-01-30 17:54:31

3

實體框架本身目前不支持異步操作。主要是因爲它建立在ADO.NET的頂層,這也不被支持。 ADO.NET在默認情況下甚至不是線程安全的。

您可以使用上面的代理方法或將其包裝到Task中。但即使提供者支持它,也不會使用任何異步調用。在這個「背景」操作期間,您也不應該對ObjectContext(查詢,添加對象,...)做任何事情,因爲這可能會導致錯誤的狀態。

相關的多線程您可以閱讀this崗位。年齡較大,但想法仍然有效。

編輯2013年4月17日:

EF6(下一個版本,目前在寫本新聞時alpha階段)將支持異步操作,即你的要求SaveChangesAsync。它還擴展了ADO.NET模型,所以如果提供者本身支持異步執行,它將會非常異步(否則回到以前的行爲,因爲沒有什麼更好的做法)。