我有一个MVC4 API REST尝试在新线程中启动进程.我正在使用框架4.5并尝试使用sync和等待clausules.
我的代码看起来像:
[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 rest调用(/ task / slowtask / launch),并期望202(接受)非常快.
使用fiddler Web调试器我发出请求,代码进入Launch(// 1),然后进入await(// 3),创建并启动慢速任务并返回Accepted(// 2).但在这一点上,fiddler没有显示202结果.见附图:
http://imageshack.us/photo/my-images/703/fiddler1.png/
当慢速任务结束时,代码继续捕获exitcode(// 4),然后202被捕获到fiddler中.
这很奇怪,因为我很久以前做过回归.我错过了什么?我怎样才能更改代码以便快速返回202而忘记任务.
注意:我知道如何使用非框架4.5功能执行此操作,我正在尝试学习如何使用async / await.
解决方法
我认为这是因为runProcessAsync()在请求的同步上下文上运行.如果您不想这样,可以使用Task.Run(()=> runProcessAsync(id));.但要小心这一点,因为IIS可以在此期间回收您的AppDomain,因此runProcessAsync()有可能无法完成.
原文地址:https://www.jb51.cc/csharp/100036.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。