簡體   English   中英

MVC3應用程序中的BackgroundWorker凍結UI

[英]BackgroundWorker in MVC3 application freezes UI

我正在開發基於MVC3的Web應用程序,該應用程序在某一時刻需要從某些外部數據庫緩存大量數據。 處理大約需要10-30分鍾(取決於流量),因此我將其放入BackgroundWorker。 當您單擊網頁上的特定按鈕時,使用ajax可以訪問控制器中的其他方法,具體取決於返回的值,在用戶界面上顯示正確的信息。

控制器:

if (IsDbLocked())
{
    return this.Json(new 
    {
        success = false,
        message = "There is already an update requested by other user on the way."
    });
}

this.model.DataUpdateBegin();

return this.Json(new { success = true });

模型:

public void DataUpdateBegin()
    {
        var backgroundWorker = new BackgroundWorker
                                   {
                                       WorkerSupportsCancellation = false,
                                       WorkerReportsProgress = true
                                   };

        backgroundWorker.DoWork += this.DataUpdateWorkerDoWork;
        backgroundWorker.ProgressChanged += this.DataUpdaterWorkerProgressChanged;
        backgroundWorker.RunWorkerCompleted += this.DataUpdaterWorkerRunWorkerCompleted;

        if (this.DataUpdateLockDb(true))
        {
            backgroundWorker.RunWorkerAsync();
        }
    }

現在,當我進行更新時,UI仍然凍結。 在調試控制器時,我看到它啟動了BackgroundWorker並立即繼續返回語句(成功= true),但隨后它就結束了,什么都沒有發生(返回的消息永遠不會到達網頁)。

我可以從其他瀏覽器/用戶看到頁面,並且一切正常,但是此特定線程被鎖定了幾分鍾(不是整個10到30分鍾,因為大約5分鍾后它就被解鎖了-超時?)

我的問題是,我做錯了什么以及如何解決。 我希望backgroundWorker只能在后台運行,並且自由用戶可以在頁面上隨意移動。 另外,在數據庫中創建條目並創建一些外部應用程序只是將其提取並做所有工作(在實際后台中)對我來說不是一個選擇。

不要像這樣使用背景工作者。 是的,該工作將在另一個線程中完成,但仍在該Web請求的范圍內。 Web請求不能存活30分鍾,很多事情都可能出錯(超時,應用程序池重新啟動,其他IIS行為..)

如果您有這種長時間運行的任務,則應在某些工作程序中執行此任務-Windows服務,也許是控制台應用程序等,然后從Web上啟動它(控制台)或將其設置為完成(消息隊列,天藍色隊列) )

另外,我希望您不要在30分鍾內鎖定數據庫(方法IsDbLocked())? 只需在事務中進行導入並使用適當的隔離級別(已提交讀操作),即可使DB始終正常工作,並且在導入完成后立即可以進行更改。

我正在開發基於MVC3的Web應用程序
...所以我把它放到BackgroundWorker中

BackgroundWorker設計用於Windows(窗體)應用程序。 要在Web應用程序中實現類似效果,請使用Task.Factory.StartNewThread (更原始)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM