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