2011-04-29 60 views
0

對於Intranet應用程序,我有一個網頁保存功能,可以導致對多個數據庫表的實質性操作。我正在使用Linq2SQL,並且有20秒的瀏覽器空閒被3個獨立的Linq.DataContext.SubmitChanges()調用吞噬。這些調用發生在由SaveButton回發調用的代碼的末尾。重定向頁面,但仍然執行緩慢Linq.DataContext.SubmitChanges()在ASP.NET中

我想要在保存按鈕操作中累積這些數據庫更改所需的實際工作。但是,如果沒有發現任何問題或衝突,我想在此之後立即將用戶重定向到另一個頁面(這樣他們就不必盯着屏幕做一些他們無法停下來的事情,然後隨着用戶的繼續,我想呼叫所有SubmitChanges()

理想的工作流程:

void btnSaveClick() 
{ 
    CalculateChangeSetProcedure 
    Redirect somewhere... 
    SubmitChangesProcedure 
} 

所以我的問題是Response.Redirect的(...,TRUE)將只是關閉下來的東西有什麼辦法,我可以用ASP做到這一點。 NET程序或將我必須在另一個線程上做異步?

+0

看起來我不會改變按鈕事件,而是改變DB提交代碼以儘可能透明地使用SqlBulkCopy。神奇的鏈接:[在Linq to Sql中實現SqlBulkCopy](http://blogs.microsoft.co.il/blogs/aviwortzel/archive/2008/05/06/implementing-sqlbulkcopy-in-linq-to-sql.aspx) 。它完全改變了我的插入時間。 – sh54 2011-04-29 15:43:11

+0

你可以發佈這個答案並接受它,如果它爲你工作。這樣問題就結束了。 – Thea 2011-05-01 10:44:43

回答

1

如果您嘗試提交少量數據,則您擁有的空閒時間不正常。你可以做的第一件事是檢查提交功能,看看你有什麼優化。例如,如果您提交了50行,並且在每個行後面都會調用SubmitChanges,則這可能會顯着減慢這些事情的速度。這種情況下的解決方案是準備好所有日期並立即提交。

另一個選擇是調用一個爲您提交更改的服務。通過這種方式,您的保存將異步完成,不會中斷用戶。服務完成後,您可以獲得一些簡單的jQuery彈出窗口或其他信息,以通知用戶如果此操作非常重要,則會完成保存。

+0

它的大量數據。開發數據庫服務器上的20秒是跨越3個數據庫的數千次插入到多個表的結果。我一直在優化的舊代碼用於提交許多小塊,正如你警告的那樣。我正在考慮你的單獨的網絡服務方法... – sh54 2011-04-29 08:36:18

+0

檢查這篇文章http://weblogs.asp.net/stevewellens/archive/2010/04/02/calling-web-service-functions-asynchronously-from-a-web -page.aspx – Thea 2011-04-29 09:07:33

+0

如果插入的數據太大,則應該小心在超時過後ASP.net進程將被終止。對此的一種可能的解決方案實際上不是調用Web服務或另一個ASP.NET線程,而是調用Windows服務。這樣線程就不會超時。 – Thea 2011-04-29 09:17:09

1

爲SubmitChanges()調用之前啓動一個單獨的後臺線程做重定向。

例如

void btnSaveClick() 
{  
     CalculateChangeSetProcedure 
     ThreadPool.QueueUserWorkItem(new WaitCallback(this.SubmitTheStuff), null); 
     Redirect somewhere.. 
} 
private void SubmitTheStuff(object obj) 
{ 
     SubmitChangesProcedure 
}  
+0

我已經給它一個嘗試,但我不能阻止Linq.DataContext.SubmitChanges()炸燬時,我把它推到另一個線程。 – sh54 2011-04-29 08:37:06

+0

是的。但至少瀏覽器應該重定向,而SubmitChanges()正在做這件事。 「炸燬」是什麼意思?記憶? – Hauzi 2011-04-29 08:49:34