2012-04-02 62 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); 
}