获取锁的任务的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);
您永远不会允许您的有效负载操作完成。取消正在运行的任务与调用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;
}
}