任务异步并等待

时间:2016-04-11 00:00:12

标签: asp.net asynchronous async-await

我希望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);

我在上面的行中看到了语法错误。我错过了什么?

2 个答案:

答案 0 :(得分:2)

根据您在此处分享的代码,您正在开始一个过程。这是令人担忧的,因为您实际上并没有等待过程的结果,实际上 - 除非您等待进程退出,否则无论asyncawait关键字如何都会发生火灾。有几种方法可以做到这一点:

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);