【发布时间】:2014-07-03 11:23:24
【问题描述】:
我的表单应用程序中有服务调用。当我的按钮被点击时,我正在调用我的服务方法。这是我的代码块:
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(样式 = Marquee)可见。但由于跨线程问题,我无法使其在已完成的方法中不可见。
当我尝试在 BGWorker 的 Completed 事件中的 UI 线程中做某事时,
void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar1.Visible = false;
}
我遇到了一个异常:
跨线程操作无效:控件“Form1”从创建它的线程以外的线程访问。
我该如何处理这个问题?
【问题讨论】:
-
您的变量“dt”似乎是全局变量,容易受到跨线程问题的影响。
-
请检查我的回答中的编辑
标签: c# winforms progress-bar backgroundworker ui-thread