我用一個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