2012-04-02 95 views
0

我有下面的代碼調用工作流程。我想知道是否可以使用async ctp將控制器更改爲異步。異步ctp MVC4和工作流程

public ActionResult Index() 
    { 
     var input = new Dictionary<string, object>(); 
     input["ViewData"] = this.ViewData; 
     var userState = "BeginInvoke example"; 

     var invoker = new WorkflowInvoker(HelloMvcDefinition); 

     Task workflowTask = Task.Factory.FromAsync<IDictionary<string, object>>(
      invoker.BeginInvoke(input, WorkflowCompletedCallback, userState), 
      invoker.EndInvoke); 

     workflowTask.Wait(); 

     return View(); 
    } 

我都試過,但我似乎無法得到它的工作:

public async Task<ActionResult> Index() 
    { 
     var input = new Dictionary<string, object>(); 
     input["ViewData"] = this.ViewData; 
     var userState = "BeginInvoke example"; 

     var invoker = new WorkflowInvoker(HelloMvcDefinition); 

     Task workflowTask = Task.Factory.FromAsync<IDictionary<string, object>>(
      invoker.BeginInvoke(input, WorkflowCompletedCallback, userState), 
      invoker.EndInvoke); 

     await workflowTask; 

     return View(); 
    } 

不幸的觀點似乎並沒有工作。關於我做錯什麼的想法?

編輯 服用意見後,我已經改變了方法,這

public class HelloController : AsyncController 
{ 
    private static readonly HelloWorkflow HelloMvcDefinition = new HelloWorkflow(); 

    public Task<ViewResult> Index() 
    { 
     var input = new Dictionary<string, object>(); 
     input["ViewData"] = ViewData; 
     const string userState = "BeginInvoke example"; 

     var invoker = new WorkflowInvoker(HelloMvcDefinition); 

     return Task.Factory.FromAsync<IDictionary<string, object>>(
      invoker.BeginInvoke(input, WorkflowCompletedCallback, userState), 
      invoker.EndInvoke).ContinueWith(t => View()); 
    }  

    static void WorkflowCompletedCallback(IAsyncResult result) 
    { 

    } 
} 

的正常工作,所以這個問題一定要我如何使用異步關鍵字。

感謝

+0

你能解釋一下症狀嗎?另外,如果您只是將await更改爲.Wait()(將其標記爲異步),它是否會再次開始工作?謝謝 – 2012-04-02 15:30:06

+0

這個問題似乎源於使用async關鍵字。如果我添加Wait()它仍然不起作用。當我調用這個控制器時,視圖應該顯示在工作流中顯示的消息中,但目前瀏覽器只是在旋轉。 – Beats 2012-04-03 11:34:26

回答

0

AsyncController而不是Controller派生。

編輯:您也可能會遇到一個known bug其中如果動作返回一個完成Task ASP.NET MVC4將掛起。您可以通過在操作方法的頂部添加await Task.Yield();來解決此問題。

在一個不相關的音符,這個代碼是更有效的(短,太):

var workflowTask = Task.Factory.FromAsync(invoker.BeginInvoke, invoker.EndInvoke, 
    input, userState); 
+0

感謝您的迴應,但不幸的是,當這個運行時我看不到任何改變。 – Beats 2012-04-03 11:25:55

+0

看到我更新的答案。 – 2012-04-03 14:22:23

+0

謝謝,但有兩件事。 1,已將task.Yield()更改爲TaskEx.Yield()。 2,較短的代碼甚至沒有編譯。 – Beats 2012-04-04 14:37:31

1

我們可以使用TAP模式來調用窗口的工作流程如下 - (詳細內容在我的博客文章中提到http://tweetycodingxp.blogspot.com/2013/06/invoke-workflow-wf-using-task-based.html

public async Task<ActionResult> Index(string id) 
{ 
    var wfInputArgs = new Dictionary<string, object> 
    { 
     ... 
    }; 

    var wfOutputArgs = await Task<IDictionary<string, object>>.Factory.StartNew(
     () => WorkflowInvoker.Invoke(new MyWorkflow(), wfInputArgs)); 
    var result = wfOutputArgs["Output1"] as IEnumerable<Class1>; 
    ... 
    return View(model); 
}