Threadpool与无尽的工人线程

时间:2015-09-02 10:57:55

标签: c# multithreading threadpool worker-thread

我有一个实现无限工作线程的类,例如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来控制线程?

1 个答案:

答案 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关键字。这本身就什么都不做。

您可以使用该任务来跟踪正在进行的工作的状态。您可以使用取消令牌来停止所有工作。