我开始Process
并希望以异步方式呼叫WaitForExit
。使用另一个Stack Overflow答案作为模板,我有这种扩展方法:
public static class ProcessExtensions
{
public static Task WaitForExitAsync(this Process process, int milliseconds)
{
var tcs = new TaskCompletionSource<object>();
process.EnableRaisingEvents = true;
process.Exited += (sender, args) => tcs.TrySetResult(null);
var cts = new CancellationTokenSource(milliseconds);
cts.Token.Register(() => tcs.TrySetCanceled());
return tcs.Task;
}
}
这样我可以致电await process.WaitForExitAsync(1000)
来完成我想要的。如果任务在超时发生之前退出,那么一切都很好。但我遇到的问题是,当超时时间被命中时,它只会抛出TaskCanceledException
。扩展方法的重点是在一行中优雅地处理事物。当我只想让它以任何方式继续时,我不需要在try catch中包装这个调用。我该如何做到这一点?
顺便问一下,请原谅我这个糟糕的问题标题。我无法想到如何简洁地说明这一点。
答案 0 :(得分:2)
如果您希望成功完成返回的任务,而不是取消,则在取消令牌时,只需在取消令牌时调用TrySetResult
而不是TrySetCancelled
。当您致电TrySetCancelled
时,您明确告知TCS将任务标记为已取消。