在做threading.timer測試時,發現在thread callback拿到1個ID以上.
理解上,應該只拿到自己的thread ID,怎麼會拿到一個以上呢?
using System.Threading;
private Timer timer;
private void Form1_Load(object sender, EventArgs e)
{
TimerCallback callback = new TimerCallback(Do);
timer = new Timer(callback, null, 0, 1000);
}
private void Do(object state)
{
//這裡會拿到不同的ID,為什麼?
string val = Thread.CurrentThread.ManagedThreadId.ToString();
this.BeginInvoke(new dSetList(_setList), new object[] { val });
}
delegate void dSetList(string val);
private void _setList(string val)
{
if (listBox1.Items.Contains(val) == false)
{
listBox1.Items.Add(val);
}
}
private void button1_Click(object sender, EventArgs e)
{
string val = System.Threading.Thread.CurrentThread.ManagedThreadId.ToString();
textBox1.Text = val;
}
統一在這回答:
也可以手動指定池的大小:
https://msdn.microsoft.com/zh-tw/library/system.threading.threadpool.setmaxthreads(v=vs.110).aspx
更詳細的介紹可以看這篇:
http://www.c-sharpcorner.com/UploadFile/1d42da/threading-pooling-in-C-Sharp/
如果是用 new Thread(()=>DoWork) 這種方式宣告的執行緒(非 ThreadPool),需要自行管理生命週期,該 Thread 結束後也無法重複使用。
而 Task, System.Timers.Timer, System.Threading.Timer 與 ThreadPool 相關的類別,才是供 CLR 管理。
感謝大大的說明,那new thread的部分
自行管理周期,是指所以我們new thread只會做我們指定的工作.
我們可以設定我們new 的thread誰要等誰t2.join()
那thread start後 t1.Start();
t1 DoWork結束後,還是會回到GC的機制,GC會判斷該thread工作已完成,會把t1的記憶體釋放,是嗎?
是的,沒錯。