多数耗时操作可以异步执行,推荐async/await。

但和UI相关的部分仅能在UI线程执行,这时UI线程的耗时操作,导致界面卡死,不够友好。

我们可以创建一个单独的UI线程显示一个正在加载的窗口,可以在窗口显示一些动画之类的。

如果是WinForms那么很容易做到。

Application.Run(new LoadingForm());

WPF没有提供这样简单的方式,官方文档中有示例《多窗口、多线程》,官方例子 ExceptionHandlingSecondaryUIThread

经过简化后,十几行代码就可以实现。

         private void 单独UI线程_Click(object sender, RoutedEventArgs e)
{
LoadingWindow loadingWindow = null;
var thread = new Thread(() =>
{
loadingWindow = new LoadingWindow();
loadingWindow.Show();
System.Windows.Threading.Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
耗时操作();
loadingWindow.Dispatcher.Invoke(() => loadingWindow.Close());
loadingWindow.Dispatcher.InvokeShutdown();
}

完整代码在我的 GitHub

最新文章

  1. jquery 监听常用监听方法
  2. 浅谈C语言中结构体的初始化
  3. 1014 : Trie树 hihocoder
  4. js-格式化数字保留两位小数-带千分符
  5. tornado 学习笔记2 Python web主流框架
  6. cmd实用命令
  7. Coding the Matrix (1):向量
  8. 每天一个linux命令(51):rcp命令
  9. 工作点滴积累(1)---MD5和编码
  10. C++ static_cast dynamic_cast reinterpret_cast const_cast转换
  11. iOS之多线程浅谈
  12. 下拉框点链接js
  13. 《JS权威指南学习总结--3.4null和undefined》
  14. Html 经典布局(三)
  15. 201521123008《Java程序设计》第10周学习总结
  16. find与tar的结合使用
  17. 《java入门第一季》之类(Scanner类)
  18. 菜鸟学IT之第一次作业
  19. spring boot集成aop实现日志记录
  20. javascript强大的日期函数

热门文章

  1. TypeScript引入moment.js报错“无法找到moment模块”及解决方法
  2. [ASP.NET Core 3框架揭秘] 文件系统[4]:程序集内嵌文件系统
  3. Cannot read property 'createElement' of undefined
  4. 分布式事务之解决方案(XA和2PC)
  5. Mac 安装nginx之后重启、停止、开启等操作
  6. 微信小程序—支付宝小程序与微信小程序的不同点对比
  7. Java多线程面试问答
  8. 报错解决 unable to unroll loop, loop does not appear to terminate in a timely manner (994 iterations) or unrolled loop is too large, use the [unroll(n)] attribute to force an exact higher number
  9. sql server中取交集、差集和并集的语法
  10. Consul初探-集成ocelot