当前位置:  编程技术>.net/c#/asp.net

.Net Winform开发笔记(一)

    来源: 互联网  发布时间:2014-10-16

    本文导语:  1. 理解“Windows 窗体应用程序”项目中Program.cs文件中的main方法与传统C++Console控制台程序中的main方法的区别。从程序运行层次上讲,两者无区别,都是程序的入口点,属于进程中的第一个线程。前者隐藏了UI应用程序必需的消...

1. 理解“Windows 窗体应用程序”项目中Program.cs文件中的main方法与传统C++Console控制台程序中的main方法的区别。从程序运行层次上讲,两者无区别,都是程序的入口点,属于进程中的第一个线程。前者隐藏了UI应用程序必需的消息循环,后者没有。

2. 每个Windows桌面应用程序都必须包含至少一个UI线程,所谓UI线程,就是可以响应Windows消息的线程。通常情况下,除非特别需要,一个Windows桌面应用程序只包含一个UI线程。

3. UI线程本质上跟普通线程一样,一般为程序的入口线程,比如Program.cs文件中的main方法,就是UI线程,而Application.Run()方法中封装了消息循环。如果没有Application.Run()方法,那么它跟其他线程一模一样。之所以叫做UI线程,是因为它之中包含一个类似
代码如下:

While(GetMessage(…))//取Windows消息
{
//处理windows消息,调用开发者编写的回调方法,如事件处理程序 等。
}

的循环。
4. 有关Windows消息机制等内容,请上网Google或者百度。

5. UI线程主要负责界面的实时更新,所以开发人员编写代码时,请遵守以下规律:
1) 不要在控件的事件处理程序中编写(或者调用)耗时的代码块;
2) 不要在控件的事件处理程序中调用阻塞方法;

6. 明白程序设计中的 委托、事件、事件处理程序的区别
代码如下:

1) Publicdelegate void KeyPressEventHandler(KeyPressEventArgse);
2) Public eventKeyPressEventHandler KeyPress;
3) Public void Textbox1_KeyPress(objectsender,KeyPressEventArgs e)
{
//….
}

其中:
1为委托 2为事件 3为事件处理程序

7. 所有的事件处理程序都是在UI线程中调用,又因为UI线程负责更新界面,所以UI线程始终必须保持顺畅(表现为3中的while循环体不能耗时太长),即不能出现长时间执 行一个方法不返回的情况。所以,请遵守5中的规律。

8. 同一个方法,可以运行在多个线程之中,方法跟线程没有一对一的原则
代码如下:

Private void thread_pro() //
{
}
1) privatebutton1_click(object sender,EventArgs e)
{
thread_pro(); //thread_pro运行在UI线程中
}
2)private button1_click(object sender,EventArgs e)
{
Thread t = new Thread(newThreadStart(thread_pro));
Thread t1 = new Thread(new ThreadStart(thread_pro));
Thread t2 = newThread(new ThreadStart(thread_pro));
t.start(); //thread_pro运行在t线程中
t1.start(); //thread_pro运行在t1线程中
t.2.start(); //thread_pro运行在t2线程中
}


3) 还可以通过Control.Invoke() 或者BenginInvoke方法将方法投递到创建该控件的线程中执行。
以上所有情况,请注意线程共享数据。

9. 多线程编程中,请注意“线程安全”问题,对于一些具备“非原子”操作的对象,必须采取措施避免发生错误。

UI控件(Button、datagridview等等)、集合(List、ArrayList)等属于此类对象,控件任何时间都不能多线程访问。

10. 坚决杜绝跨线程访问UI控件,原因见9。跨线程访问控件的方法见8中的3)。

11. 除了.Net Winform中的事件处理程序是在UI线程中调用以外,其它的回调方法几乎所有都不会在UI线程中执行,所以,开发人员在编写回调方法时,请遵守第9,10两大规律。

12. 明白什么叫回调方法。回调方法一般由开发者编写,但不由开发者调用,由系统(或者说框架)调用。在Windows桌面应用程序开发过程中,控件的事件处理程序都属于回调方法,回调方法一般用在“观察者”设计模式中,当事件的激发者激发一个事件时,它就会调用回调方法。控件的所有事件都属于此类。
另外一种常见为,异步执行某个操作,譬如,socket.BeginAccept()中的AsyncCallBack类型参数。
在框架横行的时代,一般开发者编写的代码都属于回调代码。因为程序的主要结构都由先辈们在框架中集成好了。开发者们只需要像填空一样完善空缺的部分。

13. 阻塞方法指,由于方法体内包含耗时较长的操作,所以方法不能及时返回。
所谓“及时”与“非及时”没有绝对界限,示例如下:
代码如下:

int func1() //及时返回
{
Int index = 0;
For(int i=0;i

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 现在从事.net开发,想转行到网络管理!给点意见
  • 【求助】关于net snmp的 agent开发
  • 谁有net-snmp的开发资料或说明文档-中文或英文
  • 求用Net-SNMP开发Agent的例子
  • 微软.NET被《Waters》评为最佳程序开发平台
  • 网络开发包 Commons-Net
  • asp.net 组件开发 内嵌资源引用的例子
  • 我想配一个编程平台windowsXP+VisualStudio.net或者+Jbuilder,或Linux+oracle,用来做开发,我的电脑已经远远无法满足其要求,,不值
  • 郁闷散分,最近换部门了,使用.net,c#开发,VSTS2005
  • 关于linux系统下基于NET-SNMP开发使用mib2c工具生成出现错误。--在线等。
  • 页面间隔半秒钟更新时间 Asp.net使用Comet开发http长连接示例分享
  • Visual C#.Net 网络程序开发-Socket篇第1/2页
  • .NET Web开发之.NET MVC框架介绍
  • GMap.Net开发之自定义Marker使用方法
  • .net实现微信公众账号接口开发实例代码
  • java命名空间javax.net类socketfactory的类成员方法: createsocket定义及介绍
  • .NET版的ExtJS库 Ext.Net
  • java命名空间java.net类datagramsocket的类成员方法: disconnect定义及介绍
  • node.js的.net扩展 node.net
  • java命名空间java.net类datagramsocket的类成员方法: close定义及介绍
  • 为什么输http://www.china-java.net,会自动改为http://www.china-java.net:8081?
  • java命名空间java.net接口cookiestore的类成员方法: get定义及介绍
  • 各位之不知道net-snmp是否收费?我的产品中用到了net-snmp lib是否需要向什么单位或者组织付费?
  • java命名空间java.net类socket的类成员方法: isbound定义及介绍
  • 【人才】有没有人会用VC6.0/VS2003.NET/VS2005.NET写WINDOWS下的驱动程序呀。
  • java命名空间java.net类datagrampacket的类成员方法: getsocketaddress定义及介绍
  • Java.NET or J#.NET is coming!
  • java命名空间java.net类multicastsocket的类成员方法: getinterface定义及介绍
  • make menuconfig时出错:net/Kconfig:221:can't open file "net/wireless/Kconfig"
  • java命名空间java.net枚举proxy.type的类成员方法: http定义及介绍
  • 用过net-snmp(ucd-snmp)的大侠用过net-snmp(ucd-snmp)请进(来者有分)




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3