[英]How can I avoid a TaskCanceledException in an extension method?
我正在啟動一個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中。 我該如何完成?
順便說一句,請原諒我的壞問題標題。 我想不出如何簡潔地表達這一點。
如果您希望在取消令牌時成功完成而不是取消返回的任務,那么在取消令牌時只需調用TrySetResult
而不是TrySetCancelled
。 您在調用TrySetCancelled
時明確告訴TCS將任務標記為已取消。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.