在BackgroundWorker中使用组合

时间:2012-08-13 13:09:41

标签: c# backgroundworker

  

可能重复:
  Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on

我在尝试使用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

提前致谢。

2 个答案:

答案 0 :(得分:0)

使用Dispatcher类访问来自不同线程的UI元素:

        Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            int idToUse = (int)multiSelectedIDs.SelectedValue;
        });

或者,如果您使用的是代码隐藏文件,则可以在没有Deployment.Current的情况下执行此操作。

答案 1 :(得分:0)

您无法在UI线程以外的任何线程中访问UI控件。

一种解决方案是将UI控件的值保存在单独的POCO对象中,以便您可以从后台工作程序访问它们。