WPF Dispatcher及线程

一.

  wpf中几乎所有的对象都继承自DispatcherObject,甚至包括 Application。这些继承自 DispatcherObject 的对象具有线程关联特征,也就意味着只有创建这些对象实例,且包含了 Dispatcher 的线程(通常指默认 UI 线程)才能直接对其进行更新操作。

二   .BeginInvoke和Invoke的区别

   Invoke:在拥有该控件的基础窗口句柄的线程上执行制定的委托,也就是会阻塞调用线程

   BeginInvoke:                                                   异步,非阻塞。   

  1. C#多线程 Invoke方法的使用 

  在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。

正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。

 

  2.

Delegate.BeginInvoke

通过一个委托来进行同步方法的异步调用,也是.net提供的异步调用机制之一。但是Delegate.BeginInvoke方法是从ThreadPool取出一个线程来执行这个方法,以获得异步执行效果的。也就是说,如果采用这种方式提交多个异步委托,那么这些调用的顺序无法得到保证。而且由于是使用线程池里面的线程来完成任务,使用频繁,会对系统的性能造成影响。

Delegate.BeginInvoke也是讲一个委托方法封送到其它线程,从而通过异步机制执行一个方法。调用者线程则可以在完成封送以后去继续它的工作。但是这个方法封送到的最终执行线程是运行库从ThreadPool里面选取的一个线程。

这里需要纠正一个误区,那就是Control类上的异步调用BeginInvoke并没有开辟新的线程完成委托任务,而是让界面控件的所属线程完成委托任务的。看来异步操作就是开辟新线程的说法不一定准确。

 

转载于:https://www.cnblogs.com/mercedes-Benz/p/7689573.html

WPF中使用OpenTK进行多线程渲染可以通过以下步骤实现: 1. 创建一个继承自`System.Windows.Threading.DispatcherObject`的类,该类将用于在WPF线程上执行OpenGL渲染操作。 ```csharp public class OpenGLRenderer : DispatcherObject { private GLControl glControl; public OpenGLRenderer(GLControl control) { glControl = control; } public void Render() { Dispatcher.Invoke(() => { // 在WPF线程上执行OpenGL渲染操作 glControl.MakeCurrent(); // 执行OpenGL渲染操作 // ... glControl.SwapBuffers(); }); } } ``` 2. 在WPFUI线程上创建一个OpenGL渲染控件,并将其添加到WPF窗口中。 ```csharp GLControl glControl = new GLControl(); // 设置OpenGL控件的属性和事件处理程序 // ... // 创建OpenGL渲染器,并将OpenGL控件传递给它 OpenGLRenderer renderer = new OpenGLRenderer(glControl); // 将OpenGL控件添加到WPF窗口中 myWindow.Children.Add(glControl); ``` 3. 创建一个后台线程,用于执行OpenGL渲染操作。 ```csharp Thread renderThread = new Thread(() => { while (true) { // 执行OpenGL渲染操作 renderer.Render(); // 控制渲染帧率,可根据实际需求进行调整 Thread.Sleep(16); // 60帧/秒 } }); renderThread.Start(); ``` 在这个例子中,我们创建了一个继承自`DispatcherObject`的类`OpenGLRenderer`,它用于在WPFUI线程上执行OpenGL渲染操作。然后在WPFUI线程上创建了一个OpenGL渲染控件,并将其添加到WPF窗口中。最后,在一个后台线程上执行OpenGL渲染操作,通过调用`OpenGLRenderer`的`Render`方法来在WPF线程上执行OpenGL渲染操作。 需要注意的是,在多线程渲染时,需要确保线程安全,避免多个线程同时访问OpenGL渲染上下文。在上述示例中,我们使用了`DispatcherObject`来确保在WPF线程上执行OpenGL渲染操作,从而避免了多线程访问OpenGL渲染上下文的冲突。 希望这些信息对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值