Re: [問題] thread再問

看板C_Sharp (C#)作者 (rotareti)時間14年前 (2011/05/31 18:35), 編輯推噓2(207)
留言9則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《erspicu (.)》之銘言: : private void button1_Click(object sender, RoutedEventArgs e) : { : Thread t1 = new Thread(comet_hook); : t1.Start(); : } : public void comet_hook() : { : while (true) : { : System.Threading.Thread thread = : new System.Threading.Thread( : new System.Threading.ThreadStart( : delegate() : { : richTextBox1.Dispatcher.Invoke( : System.Windows.Threading.DispatcherPriority.Normal, : new Action( : delegate() : { : richTextBox1.AppendText("aaa"); : } : ) : ); : } : )); : thread.Start(); : } : } 這個程式有兩個地方會卡住: 第一個是 comet_hook 本體, 首先我們先不管 thread 啟動後執行的部分. (啟動後就屬於另外一個 thread) 簡化後這個 comet_hook 會變成這樣: while (true) { new System.Threading.Thread() thread.Start(); } 這裡就變成一個 busy loop, 程式會不斷的 create/start new thread, 執行後可以開啟 task manager 看, process 的 thread 數量將會快速的飆漲, 直到耗盡系統資源. (除非有需要同時執行 n 個 task, 不然不需要寫成這個樣子) 第二個是 RichTextBox.AppendText, 這個 method 內部會 lock 或是 wait 某些元件. 使用 TextBox 則無此現象. 另外, 若不斷的要求 UI thread 處理你插入的工作, UI thread 將會來不及處理自己原來的工作, 視窗 UI 會沒有反應, 拖動/按鈕等等也會無法運作. (這時候可以視狀況, 加入 Thread.Sleep, 別一直送出要求, 讓 UI thread 能有時間處理自己的工作.) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.23.102

05/31 19:34, , 1F
厲害...那請問有修正解法嗎?
05/31 19:34, 1F

05/31 19:35, , 2F
會寫WHILE是因為要一直重覆HTTP REQUEST
05/31 19:35, 2F

05/31 19:35, , 3F
我C#好嫩 都不知道該怎麼辦 苦手阿...
05/31 19:35, 3F

05/31 19:42, , 4F
先把comet_hook內的thread部分拿掉,因為你已經分出thread
05/31 19:42, 4F

05/31 19:43, , 5F
再來,你要做的可能是每隔一陣子透過http讀取某個網頁之類
05/31 19:43, 5F

05/31 19:45, , 6F
若不需很精準的時間間隔,直接在while內加上Thread.Sleep
05/31 19:45, 6F

05/31 23:41, , 7F
其實WebClient或HttpRequest這些物件都有提供非同步的方
05/31 23:41, 7F

05/31 23:42, , 8F
方, 另外提醒一點 , new一個新的thread就會佔1MB的記憶體
05/31 23:42, 8F

05/31 23:43, , 9F
所以用thread要小心
05/31 23:43, 9F
文章代碼(AID): #1DvCI9HB (C_Sharp)
討論串 (同標題文章)
本文引述了以下文章的的內容:
0
3
完整討論串 (本文為第 2 之 2 篇):
0
3
文章代碼(AID): #1DvCI9HB (C_Sharp)