winform窗体的生命周期和事件加载顺序是什么?

winform窗体的生命周期和事件加载顺序是什么?,第1张

winform窗体的生命周期和事件加载顺序,如下:

1.窗体启动:

Control.HandleCreated

Control.BindingContextChanged

Form.Load

Control.VisibleChanged

Form.Activated

Form.Shown

2.窗体关闭:

Form.Closing

Form.FormClosing

Form.Closed

Form.FormClosed

Form.Deactivate

3.控件焦点与验证事件:

Enter

GotFocus

Leave

Validating

Validated

LostFocus

4.鼠标周期:

Enter

GotFocus

LostFocus

Leave

Validating

Validated

宽泛的讲,有两种方式,实现Client和Server的实时通讯(数据接收)。

1、Pull也就是拉。即Client把数据从Server中拉出来。

因为winform本质是事件驱动,如果不想用button,那么最简单的方式就是用定时器(timer),比如每10秒请求一次数据,这种方式本质上和button没有区别,还是通过事件来驱动应用,只不过是“自动”的去读取数据。优点是简单,缺点是不及时(如果数据是1秒一变,这个10秒的间隔就太长了),而且资源利用率较低(如果1小时都没有变化,这10秒一次的刷新就很占用资源)

2、Push推,即Server将信息推送到Client中去。Winform中实现推送信息,一般需要和Server建立连接,连接后,当Server需要推送(比如数据有更新)时,才向Client中发送信息。

优点是数据的时效性较好,而且资源利用合理。缺点是需要大量的代码(相比定时器那种方法)Push模式可以参考“观察者模式”的开发方式。

导致楼主出现的结果,是因为楼主将所有逻辑放在了主线程里,系统就一步一步来的。

楼主可以使用多线程的方法来实现所期望的结果。

步骤如下

1、实例化导入数据子线程

2、等待子线程完成

3、 *** 作主线程

这里面可能涉及到2个问题,一个是,如何判断子线程完成了,一个是涉及到跨线程 *** 作控件的问题。

第一个问题,可以使用一个timer控件,每隔一秒判断一次子线程状态。

第二个问题,最简单的方式是再构造器下添加“CheckForIllegalCrossThreadCalls = false”

代码参考。请自行组合。

1)全局变量

private Thread tConnectionDB

2)加载事件

//显示漏斗

//实例化子线程

tConnectionDB = new Thread(new ThreadStart(Connection))

tConnectionDB.Start()

3)Timer事件

if (tConnectionDB.ThreadState == ThreadState.Stopped)//判断线程是否停止

{

//显示数据

//停止Timer控件

timer1.Enable=false

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12150158.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存