如何在扩展方法中避免TaskCanceledException?

时间:2015-10-16 20:31:08

标签: c# async-await task

我开始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中包装这个调用。我该如何做到这一点?

顺便问一下,请原谅我这个糟糕的问题标题。我无法想到如何简洁地说明这一点。

1 个答案:

答案 0 :(得分:2)

如果您希望成功完成返回的任务,而不是取消,则在取消令牌时,只需在取消令牌时调用TrySetResult而不是TrySetCancelled。当您致电TrySetCancelled时,您明确告知TCS将任务标记为已取消。

相关问题