获取锁的任务的CancellationToken

本文关键字:CancellationToken 任务 获取 | 更新日期: 2023-09-27 18:21:49

在获取锁定的任务上使用CancellationTokenSource

如果线程在取消发生时获得锁定,则不会释放锁定

顺便说一句,线程需要立即停止,而不需要完成工作

这是这样一个代码的例子:

var cancellationTokenSource = new CancellationTokenSource;
Task.Run(new Action (() => 
{ 
    while(true)
    {
        lock (locker)
        {
            DoSomething();    
        }
        DoAnotherThing();
        Task.Delay(1000, cancellationTokenSource.Token);    
    }
}), cancellationTokenSource.Token);

我已经找到了几种方法来处理它,但我想听听的一些建议

感谢

编辑:为了回答@spender的问题,这是实现的一个想法(简称):

    object locker = new object();
    var cancellationTokenSource = new System.Threading.CancellationTokenSource;
    var token = cancellationTokenSource.Token;
    Task.Run(new Action (() => 
    { 

        while(true)
        {
            lock (locker)
            {
                using (token.Register(() => token.ThrowIfCancellationRequested()))
                {
                    break;
                };
                DoSomething();    
            }
            DoAnotherThing();
            Task.Delay(1000, cancellationTokenSource.Token);    
        }
    }), cancellationTokenSource.Token);

获取锁的任务的CancellationToken

您永远不会允许您的有效负载操作完成。取消正在运行的任务与调用Thread.Artrt(您无论如何都不想这样做)不同。在发出取消信号后,您需要将取消传播到任何可能在相当长的时间内继续执行/等待/阻止的内容。

while(!cancellationTokenSource.Token.IsCancellationRequested)
{
    lock (locker)
    {
        DoSomething(); //consider passing the token here if it takes a while...
    }
    DoAnotherThing(); //and here...
    try
    {
        Task.Delay(1000, cancellationTokenSource.Token);    
    }
    catch(TaskCanceledException)
    {
        break;
    }
}
相关文章:
  • 没有找到相关文章