从后台工作者访问组合框的数据



我遇到了一个非常奇怪的问题。我正在尝试从后台工作人员的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 窗体案例中为表示器(单元可测试,应将其公开为可注入接口。

相关内容

  • 没有找到相关文章

最新更新