我有一个实现无限工作线程的类,例如this示例,在我的例子中代表一个正文。在运行期间,我将随时生成0到8个实例,并且不断创建和销毁实例。
大多数情况下,这个类的生命周期为30秒到5分钟,但有时可能会在相对较短的时间内创建和销毁一些实例。考虑到运行此代码的低规格硬件,我倾向于遇到性能问题。
我现在想重写一下这个行为,以便我将ThreadPool用于我的正在运行的worker的集合中,我正在努力找到构造代码的正确方法。
基本上我现在的代码就像是
public class BodyCollection : IReadOnlyDictionary<ulong, TrackedBody>
{
public void Update()
{
if (createNew)
{
var body = new TrackedBody();
body.BeginTracking();
this.Add(1234, body);
}
if (remove)
{
TrackedBody body = this[1234];
body.StopTracking();
this.Remove(body);
}
}
}
public class TrackedBody
{
private readonly Thread _BiometricsThread;
private volatile bool _Continue = true;
public TrackedBody()
{
_BiometricsThread = new Thread(RunBiometricsThread);
}
public void BeginTracking()
{
_BiometricsThread.Start();
}
public void StopTracking()
{
_Continue = false;
}
private void RunBiometricsThread()
{
while(_Continue)
{
System.Threading.Thread.Sleep(1000);
}
}
}
那么如何重新编写上面的内容才能正确使用ThreadPool,以便我可以根据需要取消ThreadPool上的运行线程?我是否使用CancellationTokens或ManualResetEvents来控制线程?
答案 0 :(得分:1)
我坚信你应该使用更现代的异步编程方法。我们将在这里使用任务并行库,因为它为您提供了免费的功能:
public class TrackedBody
{
public Task BeginTrackingAsync(CancellationToken cancellation)
{
return Task.Run(() => RunBiometricsThread(cancellation));
}
private void RunBiometricsThread(CancellationToken cancellation)
{
while(!cancellation.IsCancellationRequested)
{
Task.Delay(1000, cancellation);
}
}
}
请注意,我删除了async
关键字。这本身就什么都不做。
您可以使用该任务来跟踪正在进行的工作的状态。您可以使用取消令牌来停止所有工作。