WPF多线程

以前我们在winform中新建一个线程很简单:

private void btnsearch_Click(object sender, RoutedEventArgs e)
        {
            Thread t = new Thread(new ThreadStart(ThreadSearch));
            t.Start();
            t.Join();
        }

需要多线程操作的方法:

private void ThreadSearch()
        {
            //代码
        }

但我们在WPF中运行时直接报错:“由于其他线程拥有此对象,因此调用线程无法对其进行访问”


这是为什么呢?这里我们需要了解一下WPF的特性。

WPF有一个线程是用来生成WPF中所有元素(也就是程序里面包含的所有控件)的,这些元素占用了这个创建自己的线程(这个线程一般叫做UI线程)。因此,其他线程就不可以调用这些元素了,这才出现上图对象被占用的错误。

那怎么办呢?下面我们引入DispatcherObject类,此类中有一个成员Dispatcher用于返回管理该对象的调度程序。此时,我们可以调用Dispatcher.BeginInvoke()方法将一些代码递给调度线程,从而实现多线程。

private void btnsearch_Click(object sender, RoutedEventArgs e)
        {
            Thread t = new Thread(ThreadSearch);
            t.Start();
        }

public void ThreadSearch()
        {
            this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                (ThreadStart)delegate()
            {
                //代码
            }
            );
           
        }

值得注意的是Dispatcher.BeginInvoke()方法有两个参数:第一个参数表示线程的优先级,一般使用DispatcherPriority.Normal表示立即执行。第二个参数是指向一个方法的委托,这个方法就是希望异步执行的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值