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

看板C_Sharp (C#)作者 (魚大頭)時間10年前 (2015/07/30 23:42), 編輯推噓1(102)
留言3則, 3人參與, 最新討論串4/4 (看更多)
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看看會發生什麼事情? 請把你的心得分享給板友們看看,相信你會在此中領悟到一些我想傳遞給你的想法。 以上是我的分享,若不嫌棄都歡迎來信與我討論。我所分享有可能並不完全正確, 若有誤歡迎指出指導我,謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.110.180.64 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1438270938.A.B73.html

07/31 00:39, , 1F
Lamba->Lambda, 錯字修正。
07/31 00:39, 1F

08/10 14:39, , 2F
08/10 14:39, 2F

08/10 17:30, , 3F
Lamba->Laoda ,錯字修正。 (欸
08/10 17:30, 3F
文章代碼(AID): #1LkaNQjp (C_Sharp)
文章代碼(AID): #1LkaNQjp (C_Sharp)