我希望PrintOrderAsync方法执行外部EXE来打印订单。 方法PrintOrderAsync的代码不显示任何语法错误
public async Task<string> PrintOrderAsync(string PrintExe, string ExePath, int nOrderNo)
{
await Task.Factory.StartNew(() => Process.Start(ExePath + PrintExe, nOrderNo.ToString()));
return "";
}
但我正在努力使用调用方法的语法。这是我试过的:
Task<string> result = PrintOrderAsync(PrintExe, ExePath, nOrderNo);
我在上面的行中看到了语法错误。我错过了什么?
答案 0 :(得分:2)
根据您在此处分享的代码,您正在开始一个过程。这是令人担忧的,因为您实际上并没有等待过程的结果,实际上 - 除非您等待进程退出,否则无论async
和await
关键字如何都会发生火灾。有几种方法可以做到这一点:
public static Task WaitForExitAsync(this Process process,
int milliseconds,
CancellationToken cancellationToken = default(CancellationToken))
{
return Task.Run(() => process.WaitForExit(milliseconds), cancellationToken);
}
例如,这里有一个扩展方法,可用于在Task
中包装等待进程。然后可以这样等待:
public async Task PrintOrderAsync(string PrintExe, string ExePath, int nOrderNo)
{
return Process.Start(ExePath + PrintExe, nOrderNo.ToString())
.WaitForExitAsync(5000);
}
// Then you could await it wherever...
await PrintOrderAsync(PrintExe, ExePath, nOrderNo);
或者,如果您不想等待它完成(即;您想要火,忘记,就像您现在一样),请执行以下操作:
Process.Start(ExePath + PrintExe, nOrderNo.ToString())
不要将它包装在Task
或其他任何内容中,无论如何它都是完全独立的过程(就个人而言,我更喜欢我分享的第一个选项)。
答案 1 :(得分:1)
尝试
string result = await PrintOrderAsync(PrintExe, ExePath, nOrderNo);