خطای Cross-thread operation not valid: خطای خیلی معروفی است. و در لینک زیر توضیحاتی درباره مدیریت این خطا اومده
http://msdn.microsoft.com/en-us/libr...=vs.80%29.aspx
اما در زیر من درباره کدی که نوشتم و طریقه رفع خطاش هم توضیح می دم. از دیروز صبح تا حالا داشتم تو اینترنت می گشتم تا بلاخره امروز جوابش رو پیدا کردم. به همین خاطر هم این پست رو تکمیلش کردم برای دوستانی که می خواهند از Thread ها در برنامه هاشون استفاده کنن.
اول درباره کاری که می خوام انجام بدم توضیح می دم. من تو برنامم یه فایل دارم که 10000 رکورد داخلش قرار داره. این رکوردها داخل بانک SQL نیست، داخل یه فایل که خودم اون رو ایجاد کردم. برنامه به این صورت کار می کنه. اول رکوردها رو از فایل می خونه و داخل یک آرایه از نوع Collection قرار میده. بعد اطلاعات رو داخل یک کنترل DataGridView قرار می ده برای نمایش.
من اطلاعات رو مستقیم از فایل داخل DatGridView قرار ندادم و اول اون رو داخل آرایه قرار دادم. به این خاطر که اگر می خواستم 10000 رکورد را از فایل بخونم و همزمان در DataGridView قرار بدم، خوب با سرعت خیلی کمی این کار رو می کرد. این پست رو ببینید می فهمید (https://barnamenevis.org/showthread.p...88%D8%AF%D8%9F)
چون سرعت قرار دادن رکوردها در DataGridView پایین است اومدم و از Thread برای قرار دادن اطلاعات داخل DataGridView استفاده کردم. اما استفاده از Thread در حالت غیر حفاظت شده خطای معروف
Cross-thread operation not valid
رو تولید می کنه. یعنی شما نمی توانید از کنترلی که در Threadی دیگر ایجاد شده در این Thread استفاده نمایید. اما برای مدیریت این خطا باید از خصوصیت InvokeRequired و متد Invoke کنترل مورد نظر استفاده نمایید تا برنامه اجازه دستری کنترلی را در Threadی غیر از Threadی که ایجاد شده رو بده.
کد های برنامه به صورت زیر هستند
for (int i = 0; i < Pass.Count; i++)
{
if (dgvPass.InvokeRequired)
{
dgvPass.Invoke((MethodInvoker)delegate()
{
dgvPass.Rows.Add(i + 1,
Pass[i].Position,
Pass[i].ID,
Pass[i].FirstName,
Pass[i].LastName,
Pass[i].Phone,
Pass[i].Mobile,
Pass[i].Date,
Pass[i].Address);
});
}
}
در کد بالا Pass نام آرایه ای است که اطلاعات در آن قرار دارند و dgvPass نام DataGridView است که قرار است اطلاعات را نمایش دهد.
حتما فراموش نکنید که قبل از فراخوانی Thread خصوصیت IsBackground اون رو برابر با true قرار دهید و یا با اتمام کار و یا خروج از برنامه Thread مورد نظر را از بین ببرید. در غیر اینصورت با بسته شدن برنامه Thread کماکان به کار خود ادامه می ده تا یه خیری پیدا بشه و اون رو ببنده.