Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C“用户界面”;“没有回应”;停止刷新()_C#_User Interface_Refresh - Fatal编程技术网

C# C“用户界面”;“没有回应”;停止刷新()

C# C“用户界面”;“没有回应”;停止刷新(),c#,user-interface,refresh,C#,User Interface,Refresh,如果主UI线程花费的时间太长,窗口将开始“无响应”。这不是一个问题-事实上,它实际上有几个优点,例如使UI不响应,并且在长操作完成之前有效地“缓存”输入 但是,此状态会停止Refresh()函数的工作。状态消息、进度条等停止更新。澄清一下,造成这种情况的不仅仅是长期运行本身。我可以坐下来观看长时间的手术(大约需要一分钟),而且一切都很完美。用户界面在刷新后会正确更新,一切都很好 但是,如果我左键单击标题栏,比如说,这会触发“无响应”状态,出于某种原因,它会阻止任何刷新重新绘制(它们仍在被调用)

如果主UI线程花费的时间太长,窗口将开始“无响应”。这不是一个问题-事实上,它实际上有几个优点,例如使UI不响应,并且在长操作完成之前有效地“缓存”输入

但是,此状态会停止Refresh()函数的工作。状态消息、进度条等停止更新。澄清一下,造成这种情况的不仅仅是长期运行本身。我可以坐下来观看长时间的手术(大约需要一分钟),而且一切都很完美。用户界面在刷新后会正确更新,一切都很好

但是,如果我左键单击标题栏,比如说,这会触发“无响应”状态,出于某种原因,它会阻止任何刷新重新绘制(它们仍在被调用)

将长操作放入BackgroundWorker线程将是向前一步,向后三步。我可以忍受进度条不更新等情况,但如果它能正确更新,即使是在“没有响应”的情况下也会很好

考虑到“挂起”用户界面在长时间的操作中非常乐意更新/刷新/重新绘制用户界面,当然有办法让它继续这样做,即使它被设置为“不响应”


另外,调用Application.DoEvents()也有很多缺点(就像处理消息一样,它应该在以后缓存),所以我也不能这样做。

最好将其转移到单独的线程。尽管这种行为并非毫无价值,但我怀疑这种解决方案的可维护性最终将迫使人们重新思考

您只需在UI顶部显示一个面板,阻止对所有功能的访问,即可获得所有“好处”。在这个面板上,你可以显示一个进度条和状态消息,这样用户就不会太紧张了


我认为现在的投资是值得的,可以提供一个更完善的解决方案

线程是您唯一的解决方案,您不能期望在UI线程上执行长时间的操作,而期望它保持响应。BackgroundWorker有什么问题?它有一种方法可以解决您提到的问题,我不明白为什么“不在UI线程中执行同步长时间运行的工作”这一绝对标准的方法在这里不适用。在工作进行过程中,有一个响应性的用户界面(可以最小化、移动等)将以什么方式“后退三步”呢?@Sayse:嗯,线程可能不是唯一的解决方案。我们不知道工作是什么。如果它是IO绑定的,那么async/await可能能够将所有工作保持在一个线程上,但不会阻塞。@JonSkeet-非常正确,不管怎样,我都不同意OP反对BackgroundWorker
的论点,因为“挂起”UI在长时间操作期间非常乐意更新/刷新/重新绘制UI,当然有一种方法可以让它继续这样做
你的应用程序可能没有重新绘制自己。当您在标题栏(Windows)中看到“(未响应)”时,操作系统可能已经接管了该窗口的重新绘制(使用备份存储),因为程序没有响应