我有一个MVC4 API REST试图在新线程中启动一个进程。我正在使用框架4.5并尝试使用同步并等待clausules。MVC4 WebApi进程启动器
我的代码如下所示:
[AcceptVerbs("POST")]
public HttpResponseMessage Launch(string id)
{
runProcessAsync(id); // 1
return Request.CreateResponse(HttpStatusCode.Accepted); // 2
}
protected async void runProcessAsync(string id)
{
int exitcode = await runProcess(id); // 3
string exitcodesz = string.Format("exitcode: {0}", exitcode); // 4
// do more stuff with exitcode
}
protected Task<int> runProcess(string id)
{
var tcs = new TaskCompletionSource<int>();
var process = new Process
{
StartInfo = { FileName = @"C:\a_very_slow_task.bat" },
EnableRaisingEvents = true
};
process.Exited += (sender, args) => tcs.SetResult(((Process)sender).ExitCode);
process.Start();
return tcs.Task;
}
}
理想的情况下,有人将执行API REST调用(/任务/ slowtask /发射)与POST动词和期望202(接受)非常快。
使用Fiddler Web调试器我发出请求,代码进入Launch(// 1),然后进入await(// 3),慢速任务被创建并启动并返回Accepted(// 2)。但在这一点上,提琴手不显示202的结果。见所附图像:
http://imageshack.us/photo/my-images/703/fiddler1.png/
当慢任务结束,代码继续捕获退出码(// 4),然后将202被捕获到的Fiddler。
这很奇怪,因为很久以前我做了回报。我错过了什么?我怎样才能改变这个代码,以便快速返回一个202并忘记这个任务。
注意:我知道如何做到这一点与非框架4.5功能,我想学习如何使用async/await。
我认为这是因为'runProcessAsync()'运行在请求的同步上下文中。如果你不想这样做,你可以使用'Task.Run(()=> runProcessAsync(id));'。但要小心,因为IIS可以在此期间回收您的appdomain,所以有可能'runProcessAsync()'不会完成。 – svick 2013-02-15 15:18:01
我做到了,工作。这是一个遗憾,你没有给出正确的答案,因为你解决了我的问题 – Jordi 2013-02-18 09:02:57