WPF Dispatcher.Invoke问题

夏天的枫 2015-11-11 05:10:15
我现在有个自定义window(progressbar),想在模块加载的时候show出来,然后就用了invoke方法,具体代码是

System.Windows.Application.Current.Dispatcher.Invoke(new System.Action(() =>
{
IPrism.progressBar.Show();

}));

我现在可以理解为Action里面的东西是一个子线程委托到主线程里,其实里面的东西还是在主线程里面么?
现在由于模块加载会把主线程卡住,我想在子线程里面把这个progressBar给show出来,有这种解决方案么?
或者是在子线程中加载模块?求大神指导一下!
...全文
769 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
坏小晨gogogo 2018-01-05
  • 打赏
  • 举报
回复
可以用invoke方法的另一个重载,添加background优先级
夏天的枫 2015-11-12
  • 打赏
  • 举报
回复
引用 9 楼 wyd1520 的回复:
[quote=引用 8 楼 hjq624779687 的回复:] [quote=引用 6 楼 wyd1520 的回复:] 你牛B。。用DX。。。那套控件是卡出名了。。换来的效果。。。那没招了。。。。
那做WPF的项目一般用什么控件啊,自带的一套么。[/quote] WPF自己整UI呀,又不是什么难事。GridControl功能好,但也卡,在WinForm下也卡的,只要你没用到什么特别的功能比如合并行这类的,你还是用原生的吧。这真没招。[/quote] 很不巧的就是用到了合并行。。。算了,感觉这个优化比较有限。。。只有靠硬件了。。。
本拉灯 2015-11-12
  • 打赏
  • 举报
回复
引用 8 楼 hjq624779687 的回复:
[quote=引用 6 楼 wyd1520 的回复:] 你牛B。。用DX。。。那套控件是卡出名了。。换来的效果。。。那没招了。。。。
那做WPF的项目一般用什么控件啊,自带的一套么。[/quote] WPF自己整UI呀,又不是什么难事。GridControl功能好,但也卡,在WinForm下也卡的,只要你没用到什么特别的功能比如合并行这类的,你还是用原生的吧。这真没招。
夏天的枫 2015-11-12
  • 打赏
  • 举报
回复
引用 12 楼 hjq624779687 的回复:
[quote=引用 11 楼 duanzi_peng 的回复:] 用 beginInvoke 呀,
两者有什么区别么。[/quote] 我现在设计的是在new一个窗口之前show我的progressBar,然后窗口loaded后,hide progreeBar 使用了beginInvoke后,progressBar就发生了很多奇葩的事情
孤独de猫 2015-11-12
  • 打赏
  • 举报
回复
Invoice 是同步 , BeginInvoke 是异步
夏天的枫 2015-11-12
  • 打赏
  • 举报
回复
引用 11 楼 duanzi_peng 的回复:
用 beginInvoke 呀,
两者有什么区别么。
exception92 2015-11-12
  • 打赏
  • 举报
回复
用 beginInvoke 呀,
夏天的枫 2015-11-11
  • 打赏
  • 举报
回复
引用 6 楼 wyd1520 的回复:
你牛B。。用DX。。。那套控件是卡出名了。。换来的效果。。。那没招了。。。。
那做WPF的项目一般用什么控件啊,自带的一套么。
夏天的枫 2015-11-11
  • 打赏
  • 举报
回复
引用 6 楼 wyd1520 的回复:
你牛B。。用DX。。。那套控件是卡出名了。。换来的效果。。。那没招了。。。。
刚才我试了一下,新开线程跑数据,的确是快了不少,但是由于控件之类的带来的UI线程卡,就不知道怎么优化好了,话说我觉得DX的GridControl太卡了!!!!就那么点东西,卡得不要不要的。
本拉灯 2015-11-11
  • 打赏
  • 举报
回复
你牛B。。用DX。。。那套控件是卡出名了。。换来的效果。。。那没招了。。。。
夏天的枫 2015-11-11
  • 打赏
  • 举报
回复
引用 4 楼 wyd1520 的回复:
模块加载用另一个线程加载,只要这个线程不调用UI就可以了呗。
那可能是模块中菜单usercontrol初始化太卡了,主要涉及到大量的写死的文字图片等(本来就是死的),然后控件是用的一套DX的,怎么去优化。。。迷茫了
夏天的枫 2015-11-11
  • 打赏
  • 举报
回复
引用 1 楼 wyd1520 的回复:
哪个线程创建的UI就必需在哪个线程下跑。。。。。
或者说我new 这个window的时候在在其他线程里面new它?
本拉灯 2015-11-11
  • 打赏
  • 举报
回复
模块加载用另一个线程加载,只要这个线程不调用UI就可以了呗。
夏天的枫 2015-11-11
  • 打赏
  • 举报
回复
引用 1 楼 wyd1520 的回复:
哪个线程创建的UI就必需在哪个线程下跑。。。。。
那我就只能优化模块的加载了。。。现在模块加载会把主线程卡主,然后progressBar就不顺畅。。。求指导一下
本拉灯 2015-11-11
  • 打赏
  • 举报
回复
哪个线程创建的UI就必需在哪个线程下跑。。。。。
【资源说明】 基于wpf skiasharp的光线投影法碰撞检测投篮小游戏源码.zip 该项目是个人毕设项目源码,评审分达到95分,都经过严格调试,确保可以运行!放心下载使用。 该项目资源主要针对计算机、自动化等相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现类似其他功能。 此案例主要是针对光线投影法碰撞检测功能的示例,顺便做成了一个小游戏,很简单,但是,效果却很不错。 # 投篮小游戏 规则,点击投篮目标点,就会有一个球沿着相关抛物线,然后,判断是否进入篮子里,其实就是一个矩形,直接是按照碰撞检测来的,碰到就算进去了,对其增加了一个分数统计等功能。 ## Wpf 和 SkiaSharp 新建一个 WPF 项目,然后,Nuget 包即可 要添加 Nuget 包 ```csharp Install-Package SkiaSharp.Views.WPF -Version 2.88.0 ``` 其中核心逻辑是这部分,会以我设置的 60FPS 来刷新当前的画板。 ```csharp skContainer.PaintSurface += SkContainer_PaintSurface; _ = Task.Run(() => { while (true) { try { Dispatcher.Invoke(() => { skContainer.InvalidateVisual(); }); _ = SpinWait.SpinUntil(() => false, 1000 / 60);//每秒60帧 } catch { break; } } }); ``` ## 弹球实体代码 (Ball.cs) ```csharp public class Ball { public double X { get; set; } public double Y { get; set; } public double VX { get; set; } public double VY { get; set; } public int Radius { get; set; } } ```

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧