我遇到了一个非常奇怪的问题。我正在尝试从后台工作人员的dowork事件中的组合框中获取数据。
if (this.sortBox.SelectedItem.ToString() != "Friends" && this.sortBox.SelectedItem.ToString() != "Spotify")
//sortBox = ComboBox
这是问题所在。它只是不进去,即使它是真的。在正常空白中检查它并且它有效,所以它只是在dowork事件中。但是我应该如何调用它,我认为我只需要在尝试修改 ui 上的对象时调用。真的很奇怪,如果有人能够稍微澄清一下,我会很高兴!
另一个版本:
string value = "";
sortBox.Invoke(new MethodInvoker(delegate {
if (sortBox.SelectedIndex != -1)
{
value = sortBox.SelectedItem.ToString();
}
}));
Console.WriteLine("value = " + value);
最好的选择是在启动BackgroundWorker
时,只需将所需的数据(如果示例正确,则为简单字符串(传递给长时间运行的任务,以便它可以独立于 UI 运行。
如果你真的想从工作线程访问 UI,你可以这样做:
string result = null;
Action accessUI = () => result = sortBox.SelectedItem.ToString();
if (InvokeRequired)
Invoke(accessUI); // this will run from the worker thread
else
accessUI(); // and this one from the UI thread (direct access)
return result;
您需要使用调度程序,我不记得如何在 Windows 窗体中访问它(它是传统技术,我已经将近 10 年没有碰过它了(。在 WPF 中,有一个静态应用程序类公开,但是要使 ViewModel(或在 Windows 窗体案例中为表示器(单元可测试,应将其公开为可注入接口。