我的表单应用程序中有服务调用。当我的按钮被点击时,我打电话给我的服务方法。这是我的代码块: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