4 回答

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
它可以,但它是一個(gè)黑客。
直接在MSDN頁(yè)面是thedev引用:
調(diào)用此方法會(huì)導(dǎo)致在處理所有等待窗口消息時(shí)掛起當(dāng)前線程。如果消息導(dǎo)致觸發(fā)事件,則可以執(zhí)行應(yīng)用程序代碼的其他區(qū)域。這可能會(huì)導(dǎo)致您的應(yīng)用程序出現(xiàn)難以調(diào)試的意外行為。如果執(zhí)行需要很長(zhǎng)時(shí)間的操作或計(jì)算,通常最好在新線程上執(zhí)行這些操作。有關(guān)異步編程的更多信息,請(qǐng)參閱異步編程概述。
所以微軟警告不要使用它。
此外,我認(rèn)為它是一個(gè)黑客,因?yàn)樗男袨槭遣豢深A(yù)測(cè)的和副作用傾向(這來(lái)自嘗試使用DoEvents而不是啟動(dòng)新線程或使用后臺(tái)工作程序的經(jīng)驗(yàn))。
這里沒(méi)有大男子主義 - 如果它作為一個(gè)強(qiáng)大的解決方案,我會(huì)全力以赴。但是,嘗試在.NET中使用DoEvents只會(huì)給我?guī)?lái)痛苦。

TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊
是的,System.Windows.Forms命名空間中的Application類(lèi)中有一個(gè)靜態(tài)DoEvents方法。在UI線程中執(zhí)行長(zhǎng)時(shí)間運(yùn)行的任務(wù)時(shí),System.Windows.Forms.Application.DoEvents()可用于處理UI線程上隊(duì)列中等待的消息。這樣做的好處是,在長(zhǎng)任務(wù)運(yùn)行時(shí),UI看起來(lái)更具響應(yīng)性并且不會(huì)“鎖定”。但是,這幾乎總是不是最好的做事方式。根據(jù)微軟調(diào)用DoEvents“...導(dǎo)致當(dāng)前線程被暫停,同時(shí)處理所有等待窗口消息?!?nbsp;如果觸發(fā)事件,則可能會(huì)出現(xiàn)難以追蹤的意外和間歇性錯(cuò)誤。如果你有一個(gè)廣泛的任務(wù),最好在一個(gè)單獨(dú)的線程中完成它。在單獨(dú)的線程中運(yùn)行長(zhǎng)任務(wù)允許在不干擾UI繼續(xù)平穩(wěn)運(yùn)行的情況下處理它們???a >這里有更多細(xì)節(jié)。
以下是如何使用DoEvents的示例; 請(qǐng)注意,Microsoft也提供了使用它的警告。

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
根據(jù)我的經(jīng)驗(yàn),我建議在.NET中使用DoEvents時(shí)要非常謹(jǐn)慎。在包含DataGridViews的TabControl中使用DoEvents時(shí),我遇到了一些非常奇怪的結(jié)果。另一方面,如果你所處理的只是一個(gè)帶有進(jìn)度條的小表格,那么它可能沒(méi)問(wèn)題。
底線是:如果您要使用DoEvents,則需要在部署應(yīng)用程序之前對(duì)其進(jìn)行徹底測(cè)試。
- 4 回答
- 0 關(guān)注
- 2256 瀏覽
添加回答
舉報(bào)