加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – WPF线程和GUI如何从不同的线程访问对象?

发布时间:2020-12-15 08:13:45 所属栏目:百科 来源:网络整理
导读:我有一个线程调用一个从Internet获取一些东西的对象.当此对象填满所需的所有信息时,它会引发一个具有对象的事件将所有信息.该事件由启动该线程的控制器使用. 然后将事件中返回的对象添加到通过View Model方法绑定到GUI的集合中. 问题是我不能将CheckAccess与
我有一个线程调用一个从Internet获取一些东西的对象.当此对象填满所需的所有信息时,它会引发一个具有对象的事件将所有信息.该事件由启动该线程的控制器使用.

然后将事件中返回的对象添加到通过View Model方法绑定到GUI的集合中.

问题是我不能将CheckAccess与绑定一起使用…如何解决使用从主要的其他线程创建的Object的问题?

我将对象添加到主线程集合时收到的错误是:

This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread.

这个控制器:

public class WebPingerController
{
    private IAllQueriesViewModel queriesViewModel;

    private PingerConfiguration configuration;

    private Pinger ping;

    private Thread threadPing;

    public WebPingerController(PingerConfiguration configuration,IAllQueriesViewModel queriesViewModel)
    {
        this.queriesViewModel = queriesViewModel;
        this.configuration = configuration;
        this.ping = new Pinger(configuration.UrlToPing);
        this.ping.EventPingDone += new delPingerDone(ping_EventPingDone);
        this.threadPing = new Thread(new ThreadStart(this.ThreadedStart));
    }


    void ping_EventPingDone(object sender,QueryStatisticInformation info)
    {
        queriesViewModel.AddQuery(info);//ERROR HAPPEN HERE
    }

    public void Start()
    {
        this.threadPing.Start();
    }

    public void Stop()
    {
        try
        {
            this.threadPing.Abort();
        }
        catch (Exception e)
        {

        }
    }

    private void ThreadedStart()
    {
        while (this.threadPing.IsAlive)
        {
            this.ping.Ping();
            Thread.Sleep(this.configuration.TimeBetweenPing);
        }
    }
}

解决方法

我找到了这个 blog的解决方案.

而不是只是调用集合来从线程添加对象.

queriesViewModel.AddQuery(info);

我必须将主线程传递给控制器??并使用调度程序.警卫的答案非常接近.

public delegate void MethodInvoker();
    void ping_EventPingDone(object sender,QueryStatisticInformation info)
    {
        if (UIThread != null)
        {

            Dispatcher.FromThread(UIThread).Invoke((MethodInvoker)delegate
            {
                queriesViewModel.AddQuery(info);
            },null);
        }
        else
        {
            queriesViewModel.AddQuery(info);
        } 
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读