Asp.net mvc 异步ctp MVC4和工作流

Asp.net mvc 异步ctp MVC4和工作流,asp.net-mvc,task,workflow-foundation-4,async-await,Asp.net Mvc,Task,Workflow Foundation 4,Async Await,我有下面调用工作流的代码。我想知道是否可以使用async ctp将控制器更改为异步 public ActionResult Index() { var input = new Dictionary<string, object>(); input["ViewData"] = this.ViewData; var userState = "BeginInvoke example"; var invoker = n

我有下面调用工作流的代码。我想知道是否可以使用async ctp将控制器更改为异步

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 ActionResult Index()
{
var输入=新字典();
输入[“ViewData”]=this.ViewData;
var userState=“BeginInvoke示例”;
var invoker=新的WorkflowInvoker(HelloMvcDefinition);
Task workflowTask=Task.Factory.FromAsync(
BeginInvoke(输入,WorkflowCompletedCallback,userState),
EndInvoke);
workflowTask.Wait();
返回视图();
}
我已经试过了,但似乎无法让它发挥作用:

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();
    }
公共异步任务索引()
{
var输入=新字典();
输入[“ViewData”]=this.ViewData;
var userState=“BeginInvoke示例”;
var invoker=新的WorkflowInvoker(HelloMvcDefinition);
Task workflowTask=Task.Factory.FromAsync(
BeginInvoke(输入,WorkflowCompletedCallback,userState),
EndInvoke);
等待工作流任务;
返回视图();
}
不幸的是,这种观点似乎不起作用。你知道我做错了什么吗

编辑 在接受了建议之后,我改变了方法

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)
    {

    }
}
公共类HelloController:AsyncController
{
私有静态只读HelloWorkflow HelloMvcDefinition=new HelloWorkflow();
公共任务索引()
{
var输入=新字典();
输入[“ViewData”]=ViewData;
const string userState=“BeginInvoke示例”;
var invoker=新的WorkflowInvoker(HelloMvcDefinition);
返回Task.Factory.fromsync(
BeginInvoke(输入,WorkflowCompletedCallback,userState),
EndInvoke.ContinueWith(t=>View());
}       
静态无效WorkflowCompletedCallback(IAsyncResult结果)
{
}
}
这很好,所以问题一定是我如何使用async关键字


谢谢

异步控制器
而不是
控制器
派生

编辑:如果操作返回已完成的
任务,则ASP.NET MVC4可能会挂起。您可以通过添加
wait Task.Yield()来解决此错误

另一方面,这段代码更高效(也更短):


我们可以使用TAP模式调用windows工作流,如下所示- (详情在我的博客文章中提到)

公共异步任务索引(字符串id)
{
var wfInputArgs=新字典
{
...
};
var wfOutputArgs=await Task.Factory.StartNew(
()=>WorkflowInvoker.Invoke(新的MyWorkflow(),wfInputArgs));
var结果=作为IEnumerable的wfOutputArgs[“Output1”];
...
返回视图(模型);
}

您能详细解释一下症状吗?另外,如果您只是将Wait更改为.Wait()(将其标记为async),它是否会重新开始工作?感谢这个问题似乎源于using async关键字。如果我添加Wait(),它仍然不起作用。当我调用此控制器时,视图应显示工作流中显示的消息,但当前浏览器仍在旋转。感谢您的响应,但不幸的是,我在运行时未看到任何更改。谢谢,但有两件事。1,task.Yield()是否已更改为TaskEx.Yield()。较短的代码甚至不编译。在CTP中是
TaskEx.Yield
,但在VS11中是
Task.Yield
。2.尝试显式指定泛型参数:
Task.Factory.fromsync(…)
Stephen-即使使用TaskEx.yield,它似乎仍然被卡住了。你说“卡住”到底是什么意思?工作流程是否完成?
var workflowTask = Task.Factory.FromAsync(invoker.BeginInvoke, invoker.EndInvoke,
    input, userState);
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);
}