Tuesday, May 5, 2009

Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on.

throw exception เฉพาะตอนที่รันโหมด debugging หว่า



  • ทดสอบทำ 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

Popular Posts