2010-08-24 39 views
5

內的asp.net MVC 2控制器,我有以下代碼:是控制器異步的後臺工作者?

using (BackgroundWorker worker = new BackgroundWorker()) 
         { 
          worker.DoWork += new DoWorkEventHandler(blah); 
          worker.RunWorkerAsync(var); 
         } 

我的問題是:是這樣的代碼異步,這意味着它啓動一個新的線程,而「嗒嗒」是控制器返回視圖並行執行?

如果不是,我將如何實現這些結果?

回答

7

在MVC 2中有一個稱爲AsyncController的新功能,它是在MVC中執行異步調用的正確方法。你的控制器應該從AsyncController而不是控制器繼承。那麼你的主要操作方法名稱應該有「異步」的結尾。例如,如果您有名爲布拉赫()的操作方法,你在BlahAsync命名()來代替,而這將由框架自動識別(和使用BlahCompleted()回調):

public virtual void BlahAsync() 
{ 
    AsyncManager.OutstandingOperations.Increment(); 
    var service = new SomeWebService(); 
    service.GetBlahCompleted += (sender, e) => 
     { 
      AsyncManager.Parameters["blahs"] = e.Result; 
      AsyncManager.OutstandingOperations.Decrement(); 
     }; 
    service.GetBlahAsync(); 
} 

public virtual ActionResult BlahCompleted(Blah[] blahs) 
{ 
    this.ViewData.Model = blahs; 
    return this.View(); 
} 

更多信息在這裏AsyncController:MVC AsyncController

0

我不知道這會工作爲你(我不是說這不會,只是我不肯定)。

簡短回答是,代碼是異步的。但爲了從BackgroundWorker獲得任何形式的返回值,您需要處理RunWorkerCompleted事件。

的基本機制是把一些價值到e.Result財產在你DoWork事件,然後從e.Result屬性來檢索它在你的RunWorkerCompleted事件(確保先檢查e.Error,看是否異常是在DoWork拋出)。

之所以我不確定它是否能解決問題,是因爲您使用了using關鍵字,這可確保BackgroundWorker在代碼塊的末尾處置。由於它正在異步執行其工作,所以這可能會或可能不會阻止您有機會處理RunWorkerCompleted。我真的不確定 - 也許別人知道?

0

我想你可能會遇到問題,因爲它會嘗試在後臺線程仍在使用時處理工作人員。如果沒有別的,不可預知的行爲。

1

BackgroundWorker是不是真的你想在這裏:沒有用戶界面更新與回調。您只想將工作項目引發到線程池線程並繼續前進。

ThreadPool.QueueUserWorkItem這裏的方法可能更適合,或者使用新的Task並行方法:Task.Factory.StartNew(...)