2011-08-03 43 views
0

我是WorkFlow 4(WF 4)的初學者,我正在使用它在MVC 3中遇到嚴重問題,我在網上找不到答案。從控制器MVC完成WorkFlow 4後顯示一個彈出消息

我需要顯示一個彈出消息,如果在workFlow中發生異常或在outpput參數中返回的任何異常,我有一個用戶可以編輯的頁面,最後他將單擊Save按鈕。

點擊保存按鈕將表單提交到控制器並運行一個工作流,當工作流完成時,我得到一個輸出解釋是否通過工作流更新數據是否成功,然後我需要在完成時顯示此狀態行動,但我無法,因爲我異步運行它意味着該方法將返回給用戶,並行工作流正在調用該事件。

這是我在控制器代碼:

[HttpPost()] 
    public ActionResult SaveVehicles(vehiclesData model) { 
    Services.VehiclesDataUpdate vehiclesDataUpdate = new Services.VehiclesDataUpdate(this.SessionData.DealerLotKey, null, null); 
      IDictionary<string, object> parameters = new Dictionary<string, object>(); 
      parameters.Add("VehiclesDataUpdate", vehiclesDataUpdate); 
      parameters.Add("UnionVehicles", unionVehicles); 
      parameters.Add("SolrVehicles", solrVehicles); 

      IDictionary<string, object> outputs = new Dictionary<string, object>(); 
      AutoResetEvent syncEvent = new AutoResetEvent(false); 
      WorkflowApplication wfApp = new WorkflowApplication(new VehiclesUpdate(), parameters); 

      wfApp.Completed = delegate(WorkflowApplicationCompletedEventArgs e) { 
       outputs = e.Outputs; 
       syncEvent.Set(); 

       if (!errorExceptions.IsNullOrEmpty()) { 
        //TODO: Render a parital view to display an error message or the result of the workflow in the ouptput 
        //TODO: Logging. 
       } 
      }; 

      wfApp.Aborted = delegate(WorkflowApplicationAbortedEventArgs e) { 
       syncEvent.Set(); 
      }; 

      wfApp.Run(); 

return View(model); 
    } 

我怎麼能送點東西回來時給用戶的工作流程完成?

在此先感謝。

+0

[WorkflowInvoker](http://msdn.microsoft.com/en-us/library/system.activities.workflowinvoker.aspx)或使用[ManualResetEvent](http://msdn.microsoft.com/zh-cn/ us/library/system.threading.manualresetevent.aspx)向ASP.NET工作線程發信號通知工作流應用程序已完成執行。 – Will

+0

你能提供一個例子嗎? –

+0

這裏有很多。 Troll通過[wf4]並讀取。我不會回答,因爲我相信在ASP.NET中使用[異步頁面](http://msdn.microsoft.com/en-us/magazine/cc163725.aspx)可能會有更好的解決方案。問題在於我沒有足夠熟悉這個以便給出足夠的答案。 – Will

回答

0

如果您想從MVC操作中運行工作流程,您可以通過多種方式來操作。首先,您可以像以前一樣使用WorkflowApplication。我調整了代碼以使用更適合WorkflowApplication的AyncController。

public class HomeController : AsyncController 
{ 
    [HttpPost()] 
    public void SaveVehiclesAsync(vehiclesData model) 
    { 
     Services.VehiclesDataUpdate vehiclesDataUpdate = new Services.VehiclesDataUpdate(this.SessionData.DealerLotKey, null, null); 
     IDictionary<string, object> parameters = new Dictionary<string, object>(); 
     parameters.Add("VehiclesDataUpdate", vehiclesDataUpdate); 
     parameters.Add("UnionVehicles", unionVehicles); 
     parameters.Add("SolrVehicles", solrVehicles); 

     WorkflowApplication wfApp = new WorkflowApplication(new VehiclesUpdate(), parameters); 

     wfApp.Completed = delegate(WorkflowApplicationCompletedEventArgs e) { 
      AsyncManager.Parameters["outputs"] = e.Outputs; 
      AsyncManager.OutstandingOperations.Decrement(); 
     }; 

     wfApp.Aborted = delegate(WorkflowApplicationAbortedEventArgs e) { 
      AsyncManager.OutstandingOperations.Decrement(); 
     }; 

     AsyncManager.OutstandingOperations.Increment(); 
     wfApp.Run(); 
    } 

    public ActionResult IndexCompleted(IDictionary<string, object> outputs) 
    { 
     var model = outputs["model"]; 
     return View(model); 
    } 
} 

但是,這可能並不總是最好的解決方案。一般來說,ASP.NET服務器將足夠忙,以保持所有內核的快樂,所以異步處理只會損害擴展能力。現在,如果您的工作流程主要執行異步IO,那麼這很好,但是如果它正在執行同步IO或處理,那麼使用WorkflowInvoker可能會更好。

代碼會是這樣的。

public class HomeController : Controller 
{ 
    [HttpPost()] 
    public ActionResult SaveVehicles(vehiclesData model) 
    { 
     Services.VehiclesDataUpdate vehiclesDataUpdate = new Services.VehiclesDataUpdate(this.SessionData.DealerLotKey, null, null); 
     IDictionary<string, object> parameters = new Dictionary<string, object>(); 
     parameters.Add("VehiclesDataUpdate", vehiclesDataUpdate); 
     parameters.Add("UnionVehicles", unionVehicles); 
     parameters.Add("SolrVehicles", solrVehicles); 

     IDictionary<string, object> outputs = WorkflowInvoker.Invoke(new VehiclesUpdate(), parameters); 

     var model = outputs["model"]; 
     return View(model); 
    } 
} 

注意:只有Notepad ++的代碼是否意識到小的語法錯誤。

+0

@Mautice:首先,非常感謝你的回答,它開啓了我對許多事情的眼睛。我正在做異步的方式。我現在明白它是如何工作的,但SaveVehiclesAsync()是一個無效方法,它不會返回任何東西,在我的情況下,我想在處理工作流時返回一些東西給用戶,然後當工作流完成時,我會向用戶返回一個不同的東西。我怎麼能實現SaveVehiclesAsync()返回視圖,例如在工作流程完成之前。 –

+0

查看[this](http://encosia.com/easy-incremental-status-updates-for-long-requests/)文章,瞭解如何在服務器進程仍處於活動狀態時向瀏覽器發送更新。 – Maurice

+0

另一件事,不應該這個工作流程異步獨立運行,如果工作流程需要時間來完成,我試圖去到一個不同的頁面,它將不會去工作流程完成,這是正確的嗎? –