加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – MVC4 WebApi进程启动器

发布时间:2020-12-15 07:56:35 所属栏目:百科 来源:网络整理
导读:我有一个MVC4 API REST尝试在新线程中启动进程.我正在使用框架4.5并尝试使用sync和等待clausules. 我的代码看起来像: [AcceptVerbs("POST")]public HttpResponseMessage Launch(string id){ runProcessAsync(id); // 1 return Request.CreateResponse(HttpS
我有一个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()有可能无法完成.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读