Re: [問題] Thread被咬住如何解決?

作者: singledream (魚大頭)   2015-07-30 23:42:16
Hi,
最近工作上有點忙,我也怕我寫的對一開始不熟TPL的人會有點困擾。
一開始有比較常上來看您有沒有遇到問題,後來較忙就忽略了!
針對您的問題如下:
1.1.
為何要await一個Task.Run()?因為主緒(UI thread)並不知道此thread何時結束。
若省略掉await你會發現主緒會直接結束。因此我們加上await來等待此一動作結束,
那麼為何在一個匿名委派也要用async/await?那是因為Task.Delay必須搭配await做
使用的關係。其實省略掉async/await,變成一個Thread.Sleep代替也可以。但是await
Task.Run()是不能忽略的。原因如上所敘。
1.2.
Lamba語法方面可能要請您多找找例子便會了解它的方便之處。
2.
因為你無法在一個背景執行緒裡面做更新UI的動作,必須此UI的緒自己做更新。
上面也有版友介紹的Invoke/BeginInvoke也是把更新UI這段請UI的緒自己做處理。
3.
你拔掉這段的話,其實就是一直在頻繁更新UI不是嗎?我自己拔掉是會令UI有卡住
的現象。通常我們去做頻繁更新UI(while loop)這樣的形式,最好還是隔一段時間。
為什麼?因為主緒可能還有別的事情要處理,但你若占住主緒的所有排程,會發生很多
無法預期的事情。
我想出點功課給你:你使用一個timer去做更新UI的事件。不過在此時你去讓主緒(UI)
做一個簡單的counting的while loop看看會發生什麼事情?
請把你的心得分享給板友們看看,相信你會在此中領悟到一些我想傳遞給你的想法。
以上是我的分享,若不嫌棄都歡迎來信與我討論。我所分享有可能並不完全正確,
若有誤歡迎指出指導我,謝謝。
作者: singledream (魚大頭)   2015-07-31 00:39:00
Lamba->Lambda, 錯字修正。
作者: nfsong (圖書館我來了)   2015-08-10 14:39:00
作者: uranusjr (←這人是超級笨蛋)   2015-08-10 17:30:00
Lamba->Laoda ,錯字修正。 (欸

Links booklink

Contact Us: admin [ a t ] ucptt.com