亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

.Net Winform開發筆記(一)

2020-01-24 03:36:50
字體:
來源:轉載
供稿:網友
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<100;i++)
{
Index ++;
}
Return index;
}
Int func2() //非及時返回
{
Int index = 0;
For(int i=0;i<1000;i++)
{
For(int j=0;j<1000;++j)
{
Index ++;
}
}
Return index;
}

上述func1相對而言,屬于非阻塞方法,func2屬于阻塞方法。

14. Windows窗體應用程序不會直接跟鍵盤、鼠標等硬件設備交互,它只與Windows消息有直接交互。雖然表面上鼠標鍵盤等硬件設備是操作在窗體之上的,但實質上,你 編寫的桌面應用程序是不會理解這些硬件設備的一舉一動。他們是通過操作系統(驅動程序)進行橋接的,操作系統先將硬件設備的一舉一動翻譯成windows消息(一種數據結構,程序可以理解),然后供程序理解,作出相應的反應。
15. 所謂“阻塞調用線程”,是指在某一個線程中調用了阻塞方法,從而使該線程不能及時執行以后的代碼。
復制代碼 代碼如下:

Void func()
{
Int index=0;
For(int i=0;i<10000;++i)
{
For(int j=0;j<10000;++j)
{
I ndex++;
}
}
}
Thread t = newThread(new ThreadStart(func));
t.Start(); //線程t中調用了阻塞方法func,因此線程t會被阻塞

在介紹func方法時,可以這樣描述:該方法會阻塞調用線程。

16. 同一個方法可以被多個線程調用,既可被UI線程調用,也可被非UI線程調用,那么在方法體內怎么編寫訪問UI控件(UI元素)的代碼呢?(跨線程訪問UI控件會引發異常)
復制代碼 代碼如下:

Void func()
{
Textbox1.Text=”測試”;
PictureBox1.Image = Image.FromFile(“a.jpg”);
}

1)以上func方法可能運行在UI線程中,如下:
復制代碼 代碼如下:

Private voidbutton1_Click(object sender,EventArgs e)
{
func(); //調用func方法
}

2)有如下,func方法可能運行在其他非UI線程中
復制代碼 代碼如下:

Private void button1_Click(object sender,EventArgs e)
{
Thread t = new Thread(newThreadStart(func));
t.Start(); //func訪問運行在t線程中
}

在2)中,可能引發異常。
以上問題的解決方案為:
修改func代碼為:
復制代碼 代碼如下:

Func()
{
If(this.InvokeRequired)
{
This.BeginInvoke((Action)delegate(){func()});
}
Else
{
Textbox1.Text=”測試”;
PictureBox1.Image = Image.FromFile(“a.jpg”);
}
}

有關BeginInvoke或者Invoke方法的使用,請上網Google或者百度。

17. 有關“跨線程訪問UI控件可能引發異?!钡脑?,跟多線程訪問集合可能出現錯誤的原因基本相似。下面列舉一段代碼說明情況
復制代碼 代碼如下:

ClassMyControl
{
Object root;
Public Draw()
{
GetRoot(root);
// 一系列操作…
ReleaseRoot(root);
}
Public OtherDraw()
{
GetRoot(root);
// 一系列操作 …
ReleaseRoot(root);
}
}

其中root變量同時只能被占用一次,GetRoot()獲取root的訪問權,如果root已經被占用,則拋出異常。ReleaseRoot()釋放root占用。

當在一個線程中(比如UI線程中)訪問MyControl類對象A,調用A.Draw()方法,執行到GetRoot(root)方法后,該線程失去控制權,暫停運行一下的代碼,即此時root已被占用。而另一線程中如果也要訪問同一對象A的Draw()方法,那么就會引發異常。

18.在.Net Winform應用程序中,程序與用戶的交互主要包含兩個方面,一是用戶用鼠標、鍵盤燈硬件設備進行操作,程序響應操作,然后進行反饋(比如更新界面、刷新數據等),二是不需要用戶用鼠標等硬件設備進行操作,程序自己自動進行反饋(比如QQ彈出新聞窗體、360彈窗等)。

第一種情況是我們所熟知的,比如用戶用鼠標點擊按鈕(button1),程序則彈出一個MessageBox,我們在程序中是這樣子寫的:事件處理程序如下
復制代碼 代碼如下:

Private voidbutton1_Click(object sender,EventArgs e)
{
MessageBox.Show(“彈出對話框,或者其他操作”);
}

再來理一下這個過程,首先用戶拿起鼠標點擊button1,操作系統(鼠標驅動)會捕獲這個事件,經過分析,操作系統得知用戶點擊的是哪個窗體(按鈕)、點擊的位置(坐標),點擊類型(左鍵還是右鍵或者其他),以及其他信息,之后,將這些信息封裝成一個類型(即windows消息)發送給創建該窗體(控件)的線程中的消息隊列,之后,操作系統(鼠標驅動)就不在負責了。接著,UI線程從線程消息隊列中獲取該消息(注意:這個過程是一直存在的),分析消息,調用開發人員編寫的一些回調方法,如button1_Click()方法,從而到達相應鼠標鍵盤操作的目的。從上面分析過程來看,再一次說明,程序是不會直接跟鼠標等硬件設備交互的,與它直接交互的只有Windows消息,而這個過程需要Windows操作系統起著重要作用。

第二種情況一般用在多線程編程中,當程序有耗時操作、或者需要一直監聽等情況的時候,是不能放在UI線程之中的,這時候就需要另外開辟線程,在另外的線程中處理。這種情況中,另外開辟的線程有時候需要反饋跟用戶一些信息,即更新UI界面或者彈出一個窗體等,這就涉及到跨線程訪問UI元素的問題了,詳見5和

19.以上代碼部分均為現寫的,可能出現拼寫錯誤,包涵!
另外,請配合筆記(二)中的“DOT NETWinform應用程序運行結構圖”閱讀。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品在线观看一区二区| 亚洲天堂av高清| 欧美激情喷水视频| 92国产精品久久久久首页| 中文字幕欧美精品日韩中文字幕| 精品国产电影一区| 欧美国产日韩一区二区在线观看| 国产激情综合五月久久| 亚洲日本aⅴ片在线观看香蕉| 岛国视频午夜一区免费在线观看| 少妇av一区二区三区| 欧美性猛交xxxx久久久| xxav国产精品美女主播| 亚洲欧美综合区自拍另类| 欧美久久精品午夜青青大伊人| 中文字幕欧美日韩| 久久777国产线看观看精品| 亚洲日韩中文字幕在线播放| 欧美一级电影在线| 欧美日韩亚洲激情| 欧美巨大黑人极品精男| 国产精品久久久久9999| 姬川优奈aav一区二区| 色琪琪综合男人的天堂aⅴ视频| 亚洲人成网7777777国产| 伊人成人开心激情综合网| 国产精品自产拍高潮在线观看| 自拍偷拍亚洲欧美| 久久久久久亚洲| 欧美精品做受xxx性少妇| 91亚洲精品一区| 国产日韩一区在线| 日韩欧美视频一区二区三区| 色综合久久88色综合天天看泰| 亚洲码在线观看| 国产婷婷成人久久av免费高清| 日韩成人在线视频观看| 隔壁老王国产在线精品| 欧美亚洲国产视频| 91精品国产一区| 久久天天躁狠狠躁老女人| 91精品国产综合久久香蕉| 日韩视频精品在线| 欧美性资源免费| 欧美在线视频导航| 久久国产加勒比精品无码| 97精品国产97久久久久久免费| 亚洲欧美激情视频| 亚洲国产日韩欧美综合久久| 亚洲专区国产精品| 亚洲黄色片网站| 国产日产久久高清欧美一区| 久久97精品久久久久久久不卡| 热久久这里只有| 亚洲欧美另类自拍| 亚洲精品白浆高清久久久久久| 在线电影欧美日韩一区二区私密| 最近2019中文字幕大全第二页| 国模精品视频一区二区| 美女国内精品自产拍在线播放| 岛国视频午夜一区免费在线观看| 欧美一区二区大胆人体摄影专业网站| 国产一区二区色| 欧美专区日韩视频| 日韩国产在线看| 久久久久女教师免费一区| 韩国美女主播一区| 国产福利视频一区二区| 国产精品视频网| 97精品久久久中文字幕免费| 日本精品免费一区二区三区| 国产精品女人网站| 国色天香2019中文字幕在线观看| 日韩久久免费电影| 午夜精品福利在线观看| 欧美日韩成人在线观看| 欧美激情精品久久久久久黑人| 国产精品九九久久久久久久| 91久久精品国产| 国产精品久久久久久久久久久久| 久久亚洲精品成人| 久久久久久久久久久久av| 蜜月aⅴ免费一区二区三区| 98精品国产高清在线xxxx天堂| 久久久久五月天| 91精品在线影院| 久久av.com| 欧美成人精品在线视频| 国产亚洲精品一区二555| 国产视频在线观看一区二区| 久久视频中文字幕| 久久全球大尺度高清视频| 富二代精品短视频| 国产精品劲爆视频| 亚洲色图欧美制服丝袜另类第一页| 欧美日本在线视频中文字字幕| 69影院欧美专区视频| 成人h猎奇视频网站| 91高清在线免费观看| 久久国产精品影片| 亚洲色图日韩av| 国产成人啪精品视频免费网| 欧美日韩福利视频| 欧美成人剧情片在线观看| 91久久久久久久一区二区| www.xxxx精品| 国产精品欧美日韩| 国产视频亚洲视频| 日韩视频欧美视频| 九九精品视频在线观看| 欧美一区视频在线| 亚洲国产精品久久久久秋霞蜜臀| 岛国av一区二区在线在线观看| 黄色一区二区在线观看| 精品成人69xx.xyz| 国产精品久久久| 中文字幕一区电影| 亚洲伊人一本大道中文字幕| 在线视频国产日韩| 国产精品高潮呻吟视频| 在线播放日韩av| 国产做受高潮69| 色先锋资源久久综合5566| 亚洲另类欧美自拍| 亚洲伊人第一页| 78m国产成人精品视频| 高清日韩电视剧大全免费播放在线观看| 亚洲国产精彩中文乱码av| 2019日本中文字幕| 亚洲精品日产aⅴ| 国产精品免费观看在线| 亚洲精品www久久久久久广东| 国产在线观看精品一区二区三区| 亚洲最大成人免费视频| 精品久久久久久久久久ntr影视| 91久久久在线| 在线观看久久久久久| 中文字幕亚洲一区在线观看| wwwwwwww亚洲| 欧美激情第三页| 成人看片人aa| 91精品在线影院| 国产成人亚洲综合91精品| 97在线视频免费观看| 国产精品91视频| 欧美中文在线视频| 神马久久久久久| 亚洲第一精品久久忘忧草社区| 国产成人一区二区三区小说| 国产日韩在线一区| 日韩中文字幕久久| 色视频www在线播放国产成人| 日韩国产在线看| 久久好看免费视频| 九九九久久国产免费| 久久久久久com| 在线免费看av不卡| 色婷婷综合久久久久| 欧美日韩国产丝袜美女| 欧美色视频日本版| 55夜色66夜色国产精品视频| 亚洲色图狂野欧美| 欧美黑人性生活视频| 国产精品久久久久久久久借妻|