CancellationToken用于获取锁定的任务

时间:2014-09-15 09:17:33

标签: c# locking cancellationtokensource

对获取锁定的任务使用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);

1 个答案:

答案 0 :(得分:0)

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

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;
    }
}