Control.InvokeRequired - зависит от состояния гонки - PullRequest
0 голосов
/ 17 мая 2018

Я нашел предлагаемое решение проблемы исключений между потоками в другой публикации и использовал его в своем коде ниже, но в лучшем случае я нахожу его ошибочным. Мои тесты показывают, что это правильная работа, зависит от состояния гонки, поэтому я надеялся, что кто-то сможет указать на очевидное или предложить более надежное решение.

У меня есть программа с двумя простыми формами, где единственной целью Form1 является открытие Form2. Form2 содержит только RichTextBox и имеет код, который запускает поток, который обращается к этому RichTextBox произвольным образом. Когда выполнение достигает свойства InvokeRequired, оно обычно (но не всегда) ложно, поэтому оно напрямую переходит к доступу RichTextBox, где генерируется межпотоковое исключение. Однако, когда я вызываю Thread.Sleep (...) непосредственно перед тестированием свойства InvokeRequired, кажется, что он работает правильно. Тем не менее, я ненавижу использовать 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;
      }
   }
}
...