我在另一个帖子中找到了跨线程异常问题的建议解决方案,并在下面使用了我的代码,但我发现它最多不稳定。我的测试表明它的正确操作受到竞争条件的支配,所以我希望有人能指出明显的或提供更强大的解决方案。
我有一个包含两个简单形式的程序,其中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;
}
}
}