- ทดสอบทำ load bar วิ่งไปวิ่งมาแล้วเกิดปัญหาเกี่ยวกับ thread ซะงั้น
- ปัญหาจะเกิดเฉพาะ เมื่อเราทำการ start debugging mode (F5) เท่านั้นหว่า
- ทำไม start without debugging (Ctrl + F5) ไม่แสดง exception ซะงั้นงงอย่างแรง
โค้ดฟอร์มโหลดบาร์
public partial class LoadBarForm : Form
{
//public static Form loadFormTemp;
public static Thread t;
public static Queue queueThread = new Queue();
public LoadBarForm()
{
InitializeComponent();
//MessageBox.Show("New");
if (queueThread.Count > 0)
{
Thread td = (Thread)queueThread.Dequeue();
td.Abort();
}
t = new Thread(new ThreadStart(this.RunProgressBar));
queueThread.Enqueue(t);
}
private void LoadBarForm_Load(object sender, EventArgs e)
{
//loadFormTemp = this;
t.Start();
}
private void RunProgressBar()
{
for (int i = 0; i < j =" progressBar1.Minimum;" value =" j;" k =" progressBar1.Maximum;"> progressBar1.Minimum; k--)
{
progressBar1.Value = k;
Thread.Sleep(10);
}
}
}
private void LoadBarForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (t.IsAlive)
t.Abort();
}
}
- เมื่อได้แก้ไขตาม stackoverflow.com มีคนถามเกี่ยวกับปัญหานี้แหละ
- โดยเพิ่มเกี่ยวกับ invoke เข้าไปให้ method ที่ exception ประมาณนั้น
- ไม่ค่อย จนถึงไม่มีความรู้เรื่อง thread เลยหว่าเรา แก้ได้แต่มะรู้เรื่อง - -' กำจริงๆ
private void RunProgressBar()
{
if (InvokeRequired) // Line #1
{
this.Invoke(new MethodInvoker(RunProgressBar));
return;
}
for (int i = 0; i < j =" progressBar1.Minimum;" value =" j;" k =" progressBar1.Maximum;"> progressBar1.Minimum; k--)
{
progressBar1.Value = k;
Thread.Sleep(10);
}
}
}
Note:
- แต่ทำไมพอแก้อย่างหนึ่งได้ก็เป็นอย่างอื่นอีกหว่า ThreadAbortException ซะงั้น
- พอเอาโค้ดสีแดงด้านบนออก ThreadAbortException ด้านล่างดันหายซะงั้น เกี่ยวอาไรกันเนี๋ย
- ถ้าไม่เอาโค้ดสีแดงออก แก้ ThreadAbortException ด้วย Thread.ResetAbort(); ทำให้ form loadbar เราข้างเลย ^^' เอาโค้ดสีแดงออกดีกว่าแฮะ
Related:
References:
No comments:
Post a Comment