使用Task替换Timer时Winforms中的性能问题

时间:2017-05-10 06:07:00

标签: c# winforms timer task

我有一个旧的winform应用程序,在这样的计时器中使用了高性能绘图组件(Mitov.PlotLab):

private void updateGuiTimer_Tick(...)
{
    doSomeDemandingCalculations();
    plotTheResultsInComponent();
}

我做了一些重构并改变了代码:

Task.Factory.StartNew(()=>
{
    while(isRunning)
    {
        doSomeDemandingCalculations();

        if(isPlotting) continue;

        isPlotting = true;
        BeginInvoke(new Action(()=>
        {
            plotTheResultsInComponent();
            isPlotting = false;
        }));
    }
}, TaskCreationOptions.LongRunning);

问题在于,旧方法可以跟上50毫秒的滴答间隔,而新代码与旧密码相比仅占20%。

  • 我将BeginInvoke替换为Invoke但没有运气
  • 我看到ThisThis没有帮助。
  • 我用重复的Task启动替换了单个连续任务,这使性能更差。

我没有将计算从UI线程卸载到另一个线程并且只是在UI线程中进行绘图吗? 在旧代码中有3个定时器,它们做了类似的工作。我将所有这些都重构为Task s。 我的做法有问题吗?

0 个答案:

没有答案