簡體   English   中英

如何避免擴展方法中的TaskCanceledException?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM