调用线程无法访问此对象,因为在 wpf 中另一个线程拥有它 [英] the calling thread cannot access this object because a different thread owns it in wpf

查看:32
本文介绍了调用线程无法访问此对象,因为在 wpf 中另一个线程拥有它的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    bw.DoWork += new DoWorkEventHandler(bw_DoWork);
}

private void btnAddGroup_Click(object sender, RoutedEventArgs e)
{  
    if (bw.IsBusy != true)
    {
        bw.RunWorkerAsync();
    }   
}

System.Timers.Timer timer = null;

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    timer = new System.Timers.Timer();
    timer.Interval = 1000;
    timer.Enabled = true;
    timer.Elapsed += new ElapsedEventHandler(UpdateChatContent);
}

public void UpdateChatContent()
{
    var myVar=(from a in db  select a).tolist();
    datagrid1.itemsSource=myVar;//here is the exception occurs
}

推荐答案

要访问 WPF 中的 UI 元素,您必须在 UI 线程上进行访问.如果您像这样更改代码,它应该可以工作:

For accessing UI elements in WPF you have to do the accessing on the UI Thread. It should work if you change the code like this:

public void UpdateChatContent()
{
    var myVar=(from a in db select a).Tolist();
    OnUIThread(() => datagrid1.ItemsSource=myVar);
}

private void OnUIThread(Action action)
{
    if(Dispatcher.CheckAccess())
    {
        action();
    }
    else
    {
        // if you don't want to block the current thread while action is
        // executed, you can also call Dispatcher.BeginInvoke(action);
        Dispatcher.Invoke(action);
    }
}

这篇关于调用线程无法访问此对象,因为在 wpf 中另一个线程拥有它的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆