C# 两个线程正在互相减速#

C# 两个线程正在互相减速#,c#,multithreading,asynchronous,C#,Multithreading,Asynchronous,我在Picturebox中有两张图片。当我选中复选框时,风扇开始旋转。 我创建了两个不同的线程(但它们做的是相同的工作)。如果我只检查其中一个,它工作没有问题,但如果我同时检查两个,它们会相互减慢。我希望线程不会相互影响。我如何处理这种情况 不要在后台线程中修改UI。 如果这是winform应用程序,请使用System.Windows.Forms.Timer。 如果这不是winform应用程序,请为您找到一个调用UI线程 // Initial code var tmr = new Sys

我在Picturebox中有两张图片。当我选中复选框时,风扇开始旋转。 我创建了两个不同的线程(但它们做的是相同的工作)。如果我只检查其中一个,它工作没有问题,但如果我同时检查两个,它们会相互减慢。我希望线程不会相互影响。我如何处理这种情况


不要在后台线程中修改UI。 如果这是winform应用程序,请使用System.Windows.Forms.Timer。 如果这不是winform应用程序,请为您找到一个调用UI线程

// Initial code
var tmr = new System.Windows.Forms.Timer();
tmr.Interval = 10;
tmr.Tick += Tmr_Tick;
tmr.Enabled = true;


private void Tmr_Tick( object sender, EventArgs e )
{
  // Rotate cb fan if checked
  // Rotate radial fan if checked
}

为了解释为什么这两个更新函数会相互减慢速度,我假设您在post中的代码片段不完整。应该有
Invoke
来更改控制

  • 调用非常耗时
  • 您可能会无意识地将
    线程.Sleep
    添加到
    Invoke
    中,这会导致UI线程在控件更新后休眠10毫秒。 有两个线程,每个线程更新并睡眠10毫秒,因此需要20毫秒才能看到控件更改。这可能比20毫秒更糟糕

  • 我看到您的代码有一个问题,但它可能是无关的(但也可能不是),您正在从辅助线程更改UI对象。这需要在这些UI对象上使用
    Invoke
    方法进行同步。若要调试您的代码,请逐位从线程中删除位,以找出影响其他线程的是什么。您的代码能否正常运行?使用非ui线程应该不能更改ui。您有两个非ui线程来更改它。使用Windows.Form.Timer可以更好地更改UI,因为您不需要处理线程问题。我尝试了这个解决方案,它成功了。它们并没有相互减速。谢谢但是它不像我用线程做的那样平滑。如果你想让它运行得更平滑,可以缩短间隔,使用预先计算好的图片,而不是通过图形旋转。另外,还可以搜索可能会提高图片更新速度的
    DoubleBuffer
    。我已经尝试了DoubleBuffer,但它并没有真正起作用。我将搜索预先计算好的图片。
    // Initial code
    var tmr = new System.Windows.Forms.Timer();
    tmr.Interval = 10;
    tmr.Tick += Tmr_Tick;
    tmr.Enabled = true;
    
    
    private void Tmr_Tick( object sender, EventArgs e )
    {
      // Rotate cb fan if checked
      // Rotate radial fan if checked
    }