我的表單應用程序中有服務調用。當我的按鈕被點擊時,我打電話給我的服務方法。這是我的代碼塊:BackgroundWorker with ProgressBar - 跨線程操作無效
void listBox_SelectedValueChanged(object sender, EventArgs e)
{
if (listBox.SelectedItem.Equals("Demo"))
{
progressBar1.Visible = true;
backgroundWorker1.RunWorkerAsync();
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
ObservableCollection<FilterInfo> filterInfos = new ObservableCollection<FilterInfo>();
FilterInfo myFilterObj = new FilterInfo("SUPERVISOR", userName);
filterInfos.Add(myFilterObj);
ObservableCollection<DEMOBec> demos = demoSvc.GetDemoByFilter(filterInfos, false);
dt = new Converter<DEMOBec>().ConvertDataTable(demos.ToList());
}
在調用服務之前,我讓ProgressBar(Style = Marquee)可見。但是由於Cross Thread問題,我無法在完成的方法中將其隱藏起來。
當我試圖在UI線程做一些與BGWorker的完成情況,
void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar1.Visible = false;
}
我得到一個例外:控制「Form1的」訪問:無效
跨線程操作從一個線程而不是它創建的線程。
我該如何處理這個問題?
如果您正確使用它,那是不可能的。 RunWorkerCompleted事件在UI線程上執行,所以你不應該看到這個異常。你是否正在拋出異常的代碼行?仔細檢查堆棧跟蹤。 –
「DoWork」事件更可能發生。 ObservableCollection是否以任何方式綁定到UI?修改'DoWork'事件中的那些_might_可能導致異常......不確定。 –
您的變量'dt'似乎是全局變量,容易受到跨線程問題的影響。 – Srikanth