当前位置: 编程技术>.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
.Net WInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用
关于C#.net winform程序验证moss的集成身份认证实例
在WinForm和WPF中使用GMap.Net地图插件简单教程
.Net WInform开发笔记(五)关于事件Event
.Net Winform开发笔记(四)透过现象看本质
网络开发包 Commons-Net
iis7站长之家
C#.NET学习笔记5 C#中的条件编译
哪位有西陆"Java初学者"论坛版主chairyuan的学习笔记,现在那里DOWN不了,拜托哪位发一份给我,谢谢:) myjava@263.net
asp.net GridView用法笔记
Asp.net回调技术Callback学习笔记
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