c# - CancellationTokenSource.CancelAfter 不工作

标签 c# task linqpad

我正在尝试根据这篇文章实现一些重试逻辑(但有任务) Cleanest way to write retry logic?

重试逻辑的想法是在给定的时间后执行第二个任务触发取消

void Main()
{
    RetryAction(() => Sleep(), 500);
}

public static void RetryAction(Action action, int timeout)
{
    var cancelSource = new CancellationTokenSource();                
    cancelSource.CancelAfter(timeout);

    Task.Run(() => action(), cancelSource.Token);    
}

public static void Sleep() 
{
    System.Threading.Thread.Sleep(5000);
    "done".Dump();
}

以上是 linqPad 片段(因此是“完成”.Dump())

知道为什么 CancelAfter 永远不起作用吗?

最佳答案

您的 Sleep 方法忽略了 CancellationToken。

尝试类似的东西

public static CancellationTokenSource cancelSource ;

void Main()
{
    RetryAction(() => Sleep(), 500);
}

public static void RetryAction(Action action, int timeout)
{
     cancelSource = new CancellationTokenSource();                
     cancelSource.CancelAfter(timeout);

     Task.Run(() => action(), cancelSource.Token);    
}

public static void Sleep() 
{
    for(int i = 0 ; i< 50; i++)
    {
        "Waiting".Dump();
        System.Threading.Thread.Sleep(100);

        if (cancelSource.IsCancellationRequested)
        {
            "Cancelled".Dump();
            return;
        }
    }
    "done".Dump();
}

关于c# - CancellationTokenSource.CancelAfter 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17717625/

相关文章:

c# - 将 JavaScript 值分配给 C# 变量

c# - List Clear() 方法是否会破坏子级 [C#.NET]?

javascript - 特殊字符转html代码C#

C#,NUnit 在循环中断言

c# - 当一个方法使用缓存,但偶尔会做 I/O 时,它应该返回 T 还是 Task<T>?

c# - 如何在 C# 中重新启动 System.Threading.Tasks.Task

.net - 使用 linqpad 作为主要查询工具

LinqPad 教程

ienumerable - 如何在 Linqpad 的 IEnumerable 上转储正常属性

task - 删除 celery/rabbitmq 中所有待处理任务