通过WebAPI异步调用进程

时间:2018-11-22 12:57:35

标签: c# asp.net .net asynchronous asp.net-web-api

我处于需要通过API端点(即发即忘)调用exe进程的情况。但是,我将调用的exe是运行时间较长的exe,但我需要等待它完成以执行更多代码。这将在后台发生,客户端不应该真正等待它。当我尝试下面的代码时,呼叫正在等待exe进程完成。我也尝试过使方法“异步”,但结果仍然相同。

    [HttpPost]
    public async Task<bool> ToggleCarWeaverService(string command)
    {
        try
        {
            var fileName = @"SomeExe.exe";
            await _service.RunProcessAsync(command, fileName);
            return true;

        }
        catch (Exception ex)
        {
            throw new HttpResponseException(HttpStatusCode.InternalServerError);
        }
    }


    public Task<int> RunProcessAsync(string command, string fileName)
    {
        // Use ProcessStartInfo class
        ProcessStartInfo startInfo = new ProcessStartInfo
        {
            CreateNoWindow = false,
            UseShellExecute = true,
            FileName = fileName,
            WindowStyle = ProcessWindowStyle.Normal,
            Arguments = command
        };

        try
        {
            var tcs = new TaskCompletionSource<int>();

            var process = new Process
            {
                StartInfo = startInfo,
                EnableRaisingEvents = true
            };

            process.Exited += (sender, args) =>
            {
                tcs.SetResult(process.ExitCode);
                //Do more code
                process.Dispose();

            };

            process.Start();

            return tcs.Task;
        }
        catch (Exception ex)
        {
            // Log error.
            throw ex;
        }
    }

3 个答案:

答案 0 :(得分:2)

不要等待异步任务。

使用Task.Run包装并继续

[HttpPost]
public IHttpActionResult ToggleCarWeaverService(string command) {
    Task.Run(async () => {
        var fileName = @"SomeExe.exe";
        await _service.RunProcessAsync(command, fileName);
        //...other code after process finish
    });
    return Ok();
}

答案 1 :(得分:2)

此处给出的答案将正确回答您的问题-也就是说,由于不等待结果,您的电话将立即返回。但是,不能保证该过程将继续运行。离开该功能后,您实际上将有一个可能会或可能不会完成的胭脂过程。

大多数云提供商都对此提供了解决方案(例如Azure WebJobs),或者您可以使用HangFire之类的工具自己滚动。

答案 2 :(得分:1)

那么您根本不应该进一步Angular CLI: 7.0.6 Node: 8.12.0 OS: win32 x64 Angular: ... Package Version ------------------------------------------------------ @angular-devkit/architect 0.10.6 @angular-devkit/core 7.0.6 @angular-devkit/schematics 7.0.6 @schematics/angular 7.0.6 @schematics/update 0.10.6 rxjs 6.3.3 typescript 3.1.6 进行呼叫,因此将等待呼叫await的线路更改为

RunProcessAsync