我有一个MVC4 API REST试图在新线程中启动一个进程。我正在使用框架 4.5 并尝试使用同步和等待子句。
我的代码如下所示:
[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;
}
}
理想情况下,有人会使用 POST 动词执行 api 休息调用 ( /task/slowtask/launch ) 并期望 202 (accepted) 非常快。
我使用 Fiddler Web Debugger 发出请求,代码进入 Launch (// 1),然后进入 await (// 3),创建并启动慢速任务并返回 Accepted (// 2)。但是此时,Fiddler 并没有显示 202 结果。见附图:
http://imageshack.us/photo/my-images/703/fiddler1.png/
当慢任务结束时,代码继续捕获exitcode(// 4),然后将202捕获到Fiddler中。
这很奇怪,因为我很久以前就返回了。我错过了什么?我如何更改该代码以非常快速地返回 202 而忘记任务。
注意:我知道如何使用非框架 4.5 功能来做到这一点,我正在尝试学习如何使用异步/等待。