gpt4 book ai didi

multithreading - 如何实现可取消的工作线程

转载 作者:行者123 更新时间:2023-12-04 19:21:38 26 4
gpt4 key购买 nike

我正在尝试使用 System.Threading.Tasks 命名空间中的新线程构造来实现可取消的工作线程。
到目前为止,我已经提出了这个实现:

public sealed class Scheduler
{
private CancellationTokenSource _cancellationTokenSource;
public System.Threading.Tasks.Task Worker { get; private set; }

public void Start()
{
_cancellationTokenSource = new CancellationTokenSource();

Worker = System.Threading.Tasks.Task.Factory.StartNew(
() => RunTasks(_cancellationTokenSource.Token),
_cancellationTokenSource.Token
);
}

private static void RunTasks(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
Thread.Sleep(1000); // simulate work
}
}

public void Stop()
{
try
{
_cancellationTokenSource.Cancel();
Worker.Wait(_cancellationTokenSource.Token);
}
catch (OperationCanceledException)
{
// OperationCanceledException is expected when a Task is cancelled.
}
}
}

Stop()我期望的返回 Worker.Status成为 TaskStatus.Canceled .
我的单元测试表明,在某些条件下 Worker.Status仍然设置为 TaskStatus.Running .

这是实现可取消工作线程的正确方法吗?

最佳答案

我相信问题出在你的电话上

Worker.Wait(_cancellationTokenSource.Token);

那是在等待 token 发出信号 - 它已经是,因为您刚刚调用了 Cancel() .如果你把它改成只是
Worker.Wait();

那么我相信你会看到 RanToCompletion 的状态.你不会看到取消,因为你的任务没有抛出 OperationCanceledException .如果您更改您的 RunTasks调用方法
cancellationToken.ThrowIfCancellationRequested()

最后,您将需要捕获 AggregateExceptionStop - 但随后你会看到 Canceled 的状态在末尾。

至少,这就是我的实验所表明的:)

关于multithreading - 如何实现可取消的工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2942462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com