2

在获得锁的任务上使用 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);
4

1 回答 1

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;
    }
}
于 2014-09-15T09:20:47.850 回答