我在另一篇文章中找到了针对跨线程异常问题的建议解决方案,并在下面的代码中使用了它,但我发现它充其量是不稳定的。我的测试表明它的正确操作取决于竞争条件,所以我希望有人能够指出显而易见的或提供更强大的解决方案。
我有一个包含两个简单表单的程序,其中 Form1 的唯一目的是打开 Form2。Form2 仅包含一个 RichTextBox 并具有启动一个线程的代码,该线程以任意方式访问该 RichTextBox。当执行到达 InvokeRequired 属性时,它通常(但不总是)为假,因此它直接进入生成跨线程异常的 RichTextBox 访问。但是,当我在测试 InvokeRequired 属性之前调用 Thread.Sleep(...) 时,它似乎可以正常工作。但是,我讨厌将 Sleep 用于此目的,因为它看起来像是一种可能并不总是有效的方法。是否有可靠但合理的方式来进行跨线程通信?谢谢。
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;
}
}
}