(WPF)我们被要求构建一个在应用程序繁忙时弹出的小窗口(代替等待光标或除了等待光标)。我们在窗口中放置一个文本块,并使用IsIndeterminate = true的ProgressBar。
我们在小窗口上调用show,然后启动我们长时间运行的进程,当我们通过时在小窗口上调用Close。但是,在长时间运行的过程中,ProgressBar不显示任何活动,并且小窗口在其标题中显示(Not Responding)。
这甚至可能吗?一个更好的主意?
答案 0 :(得分:2)
您需要考虑使用另一个线程(或多个线程)来执行可能需要超过100毫秒的繁重处理(100毫秒及以上可能导致在“无响应”之前出现“挂起”外观。)
您可以使用BackgroundWorker创建新主题 对象并订阅OnProgressChanged事件以指示进度条更新。然而,这并没有解决访问主(UI)线程进度条的问题。您必须检查是否需要Invoke,然后调用一段负责更新进度条的代码。
这是一个StackOverflow问题,在调用控件上的方法调用的接受答案中显示了一个很好的扩展方法:
希望有帮助!!
答案 1 :(得分:1)
问题很可能是导致应用程序“忙碌”的任何内容都在应用程序的主线程中运行。因此,应用程序停止响应,包括响应来自操作系统的布局和绘制请求。因此,当应用程序“忙碌”时,它太忙了,无法绘制新窗口。
解决方案是将尽可能多的“繁重”移动到后台线程中,这样主线程和UI就会保持响应。