我用一个BackgroundWorker和做到这一点:为什么我没有拿到“跨线程操作无效”的错误
private void loadNewAsyncToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Text = "RunWorkerAsync()";
backgroundWorkerLoading.RunWorkerAsync();
}
private void backgroundWorkerLoading_DoWork(object sender, DoWorkEventArgs e)
{
UnsafeThreadMethod("hello");
EvenUnsaferThreadMethod();
}
而现在的两种方法。
private void UnsafeThreadMethod(string text)
{
toolStripLabelRssFeedData.Text = text;
}
private void EvenUnsaferThreadMethod()
{
panelLoading.Visible = true;
}
我不明白为什么UnsafeThreadMethod
不会抛出以下异常,但EvenUnsaferThreadMethod
一样。
跨线程操作无效:控制'panelLoading'从其创建的线程以外的线程访问。
根据消息,这是因为toolStripLabelRssFeedData
是在同一个线程上创建的,但它不是。
我以为我不能调用主线程创建的控件,必须使用ProgressChanged
事件。这是怎么回事?
我还有第二个问题。当我可以使用ProgressChanged
时,这样做的优点是什么?我该怎么办?
private void EvenUnsaferThreadMethod()
{
if (panelLoading.InvokeRequired)
{
panelLoading.Invoke(new MethodInvoker(() => { EvenUnsaferThreadMethod(); }));
}
else
{
panelLoading.Visible = true;
}
}
我认为这个答案解决了OP所问的问题,这就是为什么一个看起来不安全的呼叫并没有抛出异常。这一切都围绕着这样的事实:ToolStripLabel不是从Control派生的,因此不检查线程的安全性。它恰好适用,但正如其他人指出的那样,你不能指望永远保持真实。 – 2012-03-18 14:50:45