silverlight中“跨线程访问无效”错误

silverlight中有时候的数据都是通过异步得到的,当得到需要的数据我们之间操作界面的控件,控件的值时候都会出现”跨线程访问无效。”
自定义线程来获取数据,或者对界面操作时候。这时候 UI 线程和自定义线程不是同一个线程 这样都会报错

解决方法如下

 public partial class ChildWindow1 : ChildWindow
    {
        System.Threading.Thread t;
        public ChildWindow1()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(ChildWindow1_Loaded);
        }

        void ChildWindow1_Loaded(object sender, RoutedEventArgs e)
        {
            t = new System.Threading.Thread(WriteY);
            t.Start();

        }
        private void WriteY()
        {
            test((o) =>
            {
                        Dispatcher.BeginInvoke(() =>
                              {
                                  t = null;
                                  CancelButton_Click(null, null);
                              });

            });

        }
        private void test(Action<bool> result)
        {
            if (true)
            {
                result(true);
            }
        }
        private void OKButton_Click(object sender, RoutedEventArgs e)
        {
            this.DialogResult = true;
        }

        private void CancelButton_Click(object sender, RoutedEventArgs e)
        {
            this.DialogResult = false;
        }
    }

Dispatcher 维护按优先顺序排列的特定线程的工作项队列。
当 Dispatcher 创建在一个线程,它就会成为唯一 Dispatcher 可与该线程关联即使 Dispatcher 关闭的情况下。
在 WPF, 、 DispatcherObject 只能由访问 Dispatcher 与之关联。 例如,后台线程不能更新的内容 Button 关联 Dispatcher 上 UI 线程。 为了使后台线程访问 Content 属性 Button, ,后台线程必须将工作委托给 Dispatcher 与关联 UI 线程。 这通过使用实现 Invoke 或 BeginInvoke。 Invoke 是同步和 BeginInvoke 是异步的。 该操作将添加到的队列 Dispatcher 指定 DispatcherPriority。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值