【发布时间】:2012-04-03 06:31:15
【问题描述】:
我使用 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;
}
}
【问题讨论】:
标签: c# .net winforms multithreading exception-handling