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