我处于需要通过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;
}
}
答案 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