Control.InvokeRequired - 受竞争条件限制

时间:2018-05-17 09:45:54

标签: c# multithreading cross-thread

我在另一个帖子中找到了跨线程异常问题的建议解决方案,并在下面使用了我的代码,但我发现它最多不稳定。我的测试表明它的正确操作受到竞争条件的支配,所以我希望有人能指出明显的或提供更强大的解决方案。

我有一个包含两个简单形式的程序,其中Form1的唯一目的是打开Form2。 Form2只包含一个RichTextBox,并且具有启动以任意方式访问该RichTextBox的线程的代码。当执行到达InvokeRequired属性时,它通常(但不总是)为false,因此它直接进入RichTextBox访问,在该访问中生成跨线程异常。但是,当我在测试InvokeRequired属性之前调用Thread.Sleep(...)时,它似乎正常工作。但是,我讨厌为此目的使用Sleep只是因为它看起来像一个可能并不总是有用的kluge。是否有可靠但合理的方式进行跨线程通信?感谢。

public partial class Form1 : Form
{
   public Form1()
   {
      InitializeComponent();
      var form2 = new Form2();
      form2.ShowDialog();
   }
}

public partial class Form2 : Form
{
   public Form2()
   {
      InitializeComponent();
      Thread myThread = new Thread(new ThreadStart(myStartingMethod));
      myThread.Start();
   }

   void myStartingMethod()
   {
      Test("Hello world!\n");
   }

   private delegate void myCallback(string text);
   private void Test(string text)
   {
      // If I put Thread.Sleep(...something...) here it works better.
      if (myRichTextBox.InvokeRequired)
      {
         myCallback d = new myCallback(Test);
         Invoke(d, new Object[] { text });
      }
      else
      {
         // Cross-thread exception usually occurs, but not always.
         int x = myRichTextBox.TextLength;
      }
   }
}

0 个答案:

没有答案