相关疑难解决方法(0)

cancellationtoken timeout vs task.delay()和timeout

我想运行一个应该在n毫秒后超时的操作.我已经实现了两种方法,一种是在等待n毫秒后自己取消操作,另一种是在n毫秒后将CancellationToken设置传递到期.

我担心当我的系统负载很重时,canceltoken可能会在操作开始之前到期.看来如果我自己使用Task.Delay()实现超时,那么在我的操作开始之后,Delay()调用才会运行.

我是这样做的:

public static async Task<T> TimeoutAfter<T>(this Task<T> task, TimeSpan timeout)
    {
        Task completedTask = await Task.WhenAny(task, Task.Delay(timeout));
        if (completedTask == task)
        {
            return await task;
        }

        throw new TimeoutException();
    }

// Use it like this
await SomeOperationAsync().TimeoutAfter(TimeSpan.FromMilliseconds(n));
Run Code Online (Sandbox Code Playgroud)

相比:

CancellationTokenSource source = new CancellationTokenSource(TimeSpan.FromMilliseconds(n));
await SomeOperationAsync(source.Token);
Run Code Online (Sandbox Code Playgroud)

.net task-parallel-library

10
推荐指数
1
解决办法
8435
查看次数

标签 统计

.net ×1

task-parallel-library ×1