Dictionary和BackGroundWorker,获取InvalidOperationException

时间:2014-01-28 21:39:52

标签: c#

我一定误解了一些东西,因为我不知道为什么这不起作用。

我有一个名为loadfile的词典。

public Dictionary<string, string> loadfile;

此词典中填充了从文件中读取的条目。

例如,如果我执行以下操作?

MessageBox.Show(loadfile["someentry"]);

消息框显示字符串中的值'someentry'。

然而..如果我做同样的事情,但不是在消息框中显示它,我想在一个文本框中显示它:

textBox1.Text = loadfile["someentry"];

它抛出异常(我在try-catch中运行它)。

我在这里错过了什么?

2 个答案:

答案 0 :(得分:2)

  

System.InvalidOperationException - 可以因为我在后台工作程序中运行吗?

是的,这可能是问题所在。问题不是从字典中获取值,而是设置用户界面元素的.Text属性。

必须在UI线程上完成所有UI访问。您需要将回调编组回UI 线程通过Control.Invoke(Windows窗体)或Dispatcher.Invoke(WPF)。

例如,如果这是Windows窗体,您可以执行以下操作:

var entry = loadfile["someentry"];
textBox1.BeginInvoke(new Action(() => textBox1.Text = entry));

答案 1 :(得分:0)

这样做

textBox1.Invoke(new Action(() => textBox1.Text = loadfile["someentry"]));

如果您使用的是BackgroundWorker,则可能只想订阅CompletedEventArgsDoWork

DoWork中您设置Backgroundworker

的结果

并在CompletedEventArgs中更新TextBox。 CompletedEventArgs将在Dispatcher线程

中运行

BackgroundWorker的示例用法

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    textBox1.Text = e.Result.ToString();
}

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
   //Load your dictionary or something and set the result here like 
   //e.Result = SomeAction 

}