c# - 周期性处理中的膨胀线程问题

标签 c# multithreading task-parallel-library periodic-processing

我想在工作线程上做一些周期性的工作,当工作完成时它会发出信号。发出信号后,我想等待 5 秒,然后重新进行工作。我写了下面的代码:

public class WinService : ServiceBase
{
    private readonly ManualResetEvent stopPeriodicProcess = new ManualResetEvent(false);

    protected override void OnStart(string[] args)
    {
        stopPeriodicProcess.Reset();
        ThreadPool.RegisterWaitForSingleObject(stopPeriodicProcess, InitializeEngines, null,5000, true);          
    }

    public void InitializeEngines(object state, bool timedOut)
    {       
        engine.LoadSettings();

        Task.Factory.StartNew(engine.DoSomeWork); //Fire and forget     
    }

    private void WorkCompletedEventHandler(object sender, WorkCompletedEventArgs e)
    {
        ThreadPool.RegisterWaitForSingleObject(stopPeriodicProcess,
                                               (state, timedOut) => DoPeriodicProcess(state, timedOut, e.EngineId), null,
                                               5000, true);
    }

    public void DoPeriodicProcess(object state, bool timedOut, string engineId)
    {
        if (timedOut)
        {                
            Task.Factory.StartNew(engine.DoSomeWork); //Fire and forget
        }
    }
}


public class Engine
{
    public event EventHandler<WorkCompletedEventArgs> WorkCompleted;    
    public void DoSomeWork()
    {
        //Doing some work..

        //Raise an event to signal that the work has been completed
        var args = new WorkCompletedEventArgs {EngineId = Settings.EngineId};
        RaiseWorkCompletedEvent(args);
    }

    protected virtual void RaiseWorkCompletedEvent(WorkCompletedEventArgs e)
    {
        EventHandler<WorkCompletedEventArgs> handler = WorkCompleted;
        if (handler != null)
        {
            handler(this, e);
        }
    }   
}

当我运行代码时,CPU 使用率在几秒后显示为 100%。在 VS 中调试时,我看到有太多事件工作线程在 WorkCompletedEventHandler 内的 RegisterWaitForSingleObject 处等待。

为什么线程在调用 RegisterWaitForSingleObject 后没有死掉?我错过了什么吗?

最佳答案

未经测试,但我认为这是由于事件未被重置所致:

private void WorkCompletedEventHandler(object sender, WorkCompletedEventArgs e)
{
    stopPeriodicProcess.Reset();
    ThreadPool.RegisterWaitForSingleObject(stopPeriodicProcess,
                                           (state, timedOut) => DoPeriodicProcess(state, timedOut, e.EngineId), null,
                                           5000, true);
}

此外,我不明白你为什么要这样做,你不能使用专门为这种用例设计的计时器吗?

关于c# - 周期性处理中的膨胀线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17092394/

相关文章:

c# - 为什么 POST 操作会丢失模型值?

java ExecutorService 如何处理超时

c# - 将两个并行任务的结果合并到一个列表中

java - 从正在运行的线程调用方法

perl - worker MPM 下 mod_perl 中的进程内协调

c# - BlockingCollection<T>.TakeFromAny,用于具有不同泛型类型的集合

parallel-processing - 应该在数据库调用中使用 Parallel.ForEach 吗?

c# - 使用 imageresizer 和 WicBuilder 时,水印无法显示在图像上

c# - 如何为 .NET Core View 类替换 Request.Url.GetLeftPart(UriPartial.Authority)?

c# - 使用带有加密连接字符串的 Application.LoadFromSqlServer() 加载 SSIS 包