C# 另類跨線程操作控件異常
今天寫了一小程序沃琅,但是卻遇到了一個奇怪的問題,我在窗體點(diǎn)擊按鈕,然后往RichTextbox控件添加文本內(nèi)容,有時會拋出從不是創(chuàng)建它的線程訪問RichTextbox控件墅冷,詭異的地方有兩處:
- 按道理,我在界面上點(diǎn)擊按鈕或油,然后顯示另一個控件的內(nèi)容寞忿,應(yīng)該不會有跨線程操作控件的異常才對;
- 就算有異常顶岸,但是我在設(shè)置RichTextbox控件是添加了InvokeRequired判斷并添加了委托罐脊,所以就算是跨線程訪問此控件,也應(yīng)該不會拋異常啊蜕琴,但是卻還是拋異常了萍桌,真的。
而且這個異常也不是必現(xiàn)凌简,有時有上炎,有時沒有,這就真讓人頭大了雏搂。
找啊找藕施,找問題,最后確定是在窗體的構(gòu)造函數(shù)里出了問題凸郑。因?yàn)槲以跇?gòu)造函數(shù)中調(diào)用了另一個對象的初始化方法裳食,并注冊了它的一個事件。問題的關(guān)鍵就在于這個回調(diào)事件芙沥,如果事件在窗體構(gòu)造函數(shù)執(zhí)行完成之后再觸發(fā)的诲祸,那程序正常;如果窗體構(gòu)造函數(shù)還未執(zhí)行完成而昨,異步回調(diào)事件先觸發(fā)了救氯,那么,不好意思歌憨,程序必然會出現(xiàn)上述異常着憨。這就可以解釋上述的兩個疑點(diǎn)了。
那么务嫡,為什么呢甲抖??心铃?准谚?
原因還是在于這個異步回調(diào)事件,因?yàn)槲以诋惒交卣{(diào)的事件中訪問了可能會拋異常的RichTextbox控件于个,來顯示一些信息日志氛魁,這就導(dǎo)致有可能不是主線程來創(chuàng)建這個控件(大概就是這個意思)。
所以,修改下程序秀存,將在構(gòu)造函數(shù)中注冊事件、調(diào)用初始化方法等操作或链,放到窗體的_Load事件中去惫恼,完事兒,一切正常澳盐。