WPF多线程

来源:互联网 发布:2017免费下载农村淘宝 编辑:程序博客网 时间:2024/05/18 03:38

以前我们在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表示立即执行。第二个参数是指向一个方法的委托,这个方法就是希望异步执行的代码。

0 0