[C#] 实现可设置超时的 Task

2021-06-16 05:03

阅读:390

标签:task   http   var   new   except   href   throw   ack   for   

前言

如何实现支持超时的 Task ?
关键点: Task.WhenAny

实现

一个扩展方法就可以搞定。

// 有返回值
public static async Task TimeoutAfter(this Task task, TimeSpan timeout)
{
    using (var timeoutCancellationTokenSource = new CancellationTokenSource())
    {
        var completedTask = await Task.WhenAny(task, Task.Delay(timeout, timeoutCancellationTokenSource.Token));
        if (completedTask == task)
        {
            timeoutCancellationTokenSource.Cancel();
            return await task;  // Very important in order to propagate exceptions
        }
        else
        {
            throw new TimeoutException("The operation has timed out.");
        }
    }
}

// 无返回值
public static async Task TimeoutAfter(this Task task, TimeSpan timeout)
{
    using (var timeoutCancellationTokenSource = new CancellationTokenSource())
    {
        var completedTask = await Task.WhenAny(task, Task.Delay(timeout, timeoutCancellationTokenSource.Token));
        if (completedTask == task)
        {
            timeoutCancellationTokenSource.Cancel();
            await task;  // Very important in order to propagate exceptions
        }
        else
        {
            throw new TimeoutException("The operation has timed out.");
        }
    }
}

参考

c# - Asynchronously wait for Task to complete with timeout - Stack Overflow

[C#] 实现可设置超时的 Task

标签:task   http   var   new   except   href   throw   ack   for   

原文地址:https://www.cnblogs.com/jasongrass/p/10354727.html


评论


亲,登录后才可以留言!