我在尝试使用BackgroundWorker时遇到问题。
我有一个复选框,点击时我想调用BackgroundWorkers RunWorkerAsync方法:
private void checkBoxLoadRecords_CheckedChanged(object sender, EventArgs e)
{
bw.RunWorkerAsync();
}
所以在DoWork活动中我在我的一个组合上调用SelectionChangeComitted事件:
void bw_DoWork(object sender, DoWorkEventArgs e)
{
comboSelectedIDs_SelectionChangeCommitted(sender, e);
}
在SelectionChangeComitted方法中,我在第一行收到错误,我尝试将ID检索到变量中。我收到的错误是:跨线程操作无效:控制'comboSelectedIDs'从其创建的线程以外的线程访问。
void comboSelectedIDs_SelectionChangeCommitted(object sender, EventArgs e)
{
int idToUse = (int)multiSelectedIDs.SelectedValue; //Errors here!
SetupNamesCombo(idToUse);
}
如何解决这个问题?
我认为在使用自定义控件时我会遇到类似的问题,因为他们使用组合文本值,我想在BackgroundWorker中得到它。
我正在使用C#4.0
提前致谢。
答案 0 :(得分:0)
使用Dispatcher类访问来自不同线程的UI元素:
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
int idToUse = (int)multiSelectedIDs.SelectedValue;
});
或者,如果您使用的是代码隐藏文件,则可以在没有Deployment.Current
的情况下执行此操作。
答案 1 :(得分:0)
您无法在UI线程以外的任何线程中访问UI控件。
一种解决方案是将UI控件的值保存在单独的POCO对象中,以便您可以从后台工作程序访问它们。