c# - 事件在错误的线程中?

标签 c# wpf multithreading

我有一个关于线程的问题。

我有一个 WPF 应用程序,它应该显示某些查询的状态。为此,我创建了一个类,它在多个线程(后台 worker )中运行多个查询。我还创建了一个事件,因此我可以在查询运行时使用react。

    private void cmdStart(object sender, RoutedEventArgs e)
    {
        QuerySetup qs = new QuerySetup();
        //Filling qs with some data
        //...
        SqlProxy sql = new SqlProxy();
        sql.QueryCompleted += new SqlProxy.QueryCompletedEventHandler(sql_QueryCompleted);

        //Starts the backgroundworker
        sql.RunSQL(qs);
    }

    private void sql_QueryCompleted(QueryResult qr)
    {
        lstStatus.Items.Clear();
        lstStatus.Items.Add(qr.RuntimeTotal);
        //... and some more...
    }

现在我收到一条错误消息,告诉我我无法访问 lstStatus,因为它属于不同的线程。

但是为什么?该事件不应该与 GUI 在同一个线程中吗?我该如何解决我的问题?

最佳答案

没有。
大多数非 UI 组件将在非 UI 线程(通常是 ThreadPool 线程)中引发回调

您可以调用 Dispactcher.BeginInvoke 在 UI 线程上运行代码:

Dispactcher.BeginInvoke(new Action(delegate {
    ...
}));

关于c# - 事件在错误的线程中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13160140/

相关文章:

c# - 解析具有相同名称元素的复杂 XML

C# BeginInvoke 问题

c# - 从另一个线程更新时,DataGridView 不会重新绘制自身

c - 如何获取线程的CPU指令数?

java - 在Java线程应用程序中获取不正确的输出? [复制]

c# - 解析JSON POST请求C#

c# - 我是否应该在服务器上使用Parallel.ForEach进行多个同时的Web请求

c# - 如何从委托(delegate)获取 C# 函数中的地址?

c# - 如何像在 Winform 中那样以编程方式在 WPF 中添加事件处理程序

wpf - 有没有办法在wpf中的元素之外找出鼠标左键按下事件?