Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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#_.net_Winforms - Fatal编程技术网

C# 如何知道何时加载并显示了所有控件?

C# 如何知道何时加载并显示了所有控件?,c#,.net,winforms,C#,.net,Winforms,Windows窗体应用程序中事件的实际顺序是什么 我的意思是,当我将代码放入Form\u show事件时,我希望代码只在表单显示后运行: 动词(与宾语连用),show,show或show,show。1.引起 或者让别人看到…- 但是显示的表单事件有点误导。如果我在该事件中做了一些繁重的工作,那么代码似乎是在表单显示完成之前执行的。假设我有一个主菜单,一个小的工具栏和一个文本框 我想做一些繁重的事情(目前不需要线程和工作线程…),所以我可以使用的最后一个事件应该是Form\u show。因此,我将

Windows窗体应用程序中事件的实际顺序是什么

我的意思是,当我将代码放入
Form\u show
事件时,我希望代码只在表单显示后运行:

动词(与宾语连用),show,show或show,show。1.引起 或者让别人看到…-

但是显示的
表单
事件有点误导。如果我在该事件中做了一些繁重的工作,那么代码似乎是在
表单
显示完成之前执行的。假设我有一个
主菜单
,一个小的
工具栏
和一个
文本框

我想做一些繁重的事情(目前不需要线程和工作线程…),所以我可以使用的最后一个事件应该是
Form\u show
。因此,我将繁重的代码放在那里,但当表单开始显示时,我会等待5-6秒,等待
工具栏
和要显示的内容(这最终发生在繁重的代码完成任务之后)

这让我相信我订阅了错误的事件。我根本不想看到
表单_
事件。我真正需要的是:

Form_,当所有事件均未显示事件时


那么,我怎么知道所有的东西(控件)什么时候都被完全加载和显示了呢?

显示的
事件实际上是引发的与初始化相关的最后一个事件。但是,请注意,在Windows(和其他平台)中,UI对象的实际呈现(屏幕上绘制)是延迟。UI对象的创建只会分配所有必要的资源,并使对象的可视区域“无效”。平台随后会安排渲染事件(在非托管窗口中,这是
WM_PAINT
,在Winforms API中,这将是
控件
实例的
PAINT
事件)

在UI对象的线程可用之前,无法调度呈现事件。如果在
显示的
事件中有长时间运行的代码,则会使UI对象的线程在代码期间不可用。即,在代码完成之前,不会绘制任何内容

当事情“稳定下来”时,您还可以使用其他事件更可靠地检测。例如,事件会告诉您主应用程序线程何时将进入空闲状态。或者,您可以只订阅表单的事件。在任何一种情况下,您都希望使用来分派长时间运行的代码,以便不阻止对这些事件的处理


现在,所有这些都表明:你真的不应该在UI线程中执行任何长时间运行的工作,句号。使用上述任何一个事件都不能解决根本问题;它只是将问题延迟到UI的初始呈现之后。在执行长时间运行的工作时,UI仍然会被阻塞,坦率地说,用户可能会实际上,我发现根本没有UI比有一些看起来他们可以交互但他们不能交互的东西(即对他们的输入没有响应)更可取


在最新版本的.NET中,有一些非常好的机制可用于将长时间运行的工作转移到后台线程,以便用户界面能够保持响应。请参阅C#中的和。如果愿意,您可以使用较旧的
BackgroundWorker
对象来完成相同的任务。

如果您正在做繁重的工作(5-6秒!),UI将冻结(而不是重新绘制)那么长时间,无论你将其放入哪个事件。如果真的需要这么长时间,你应该真正研究backgroundworker或线程(我知道,你说了没关系,但仍然)@Blorgbeard是的。我已经有backgroundworker事件(尽管现在是空的)补充。我只是有点心烦意乱,去搜索,在这上面找不到任何东西。现在我不知道如何判断所有东西何时都显示了。我相信有一天它会派上用场的……你能不能不用
表单.Load
处理程序来执行“重载”操作显示表单前的代码?您需要使用后台线程来执行繁重的工作。在主UI流中执行繁重且长时间的操作会冻结表单。即使创建了菜单和工具栏并向用户显示,它们也不会工作,直到工作完成。