PDA

View Full Version : خطای Cross-thread operation not valid در استفاده از Backgroundworker



mokamel
چهارشنبه 06 خرداد 1394, 17:44 عصر
سلام
دوستان من در برنامم وقتی بک گراند ورکر رو صدا میزنم که توی لیست باکس چیزی بنویسم . این ارور رو میده چرا ؟

An exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll but was not handled in user code
Additional information: Cross-thread operation not valid: Control 'lisbox_link' accessed from a thread other than the thread it was created on.



131709

محمد رضا فاتحی
چهارشنبه 06 خرداد 1394, 18:22 عصر
در مورد invoke سرچ کنید

alibilgats
چهارشنبه 06 خرداد 1394, 19:30 عصر
سلام دوست عزیز
تا جایی که من میدونم شما نمیتونی از object هایی که به GUI مربوط میشه توی قسمت DoWork بکگراند ورکر بصورت مستقیم استفاده کنی!
واسه حل مشکل اول شما بیا یه آرایه تعریف کن و آیتماتو توی اون بریز! بعدش توی متد RunWorkerComplete اونا رو از آرایه بخون و توی ListBox بریز!
یا اگه نمایش میزان کارکرد کد خیلی برات مهمه از متد ProgressChanged استفاده کن!:چشمک:

mokamel
جمعه 08 خرداد 1394, 11:08 صبح
دوستان عزیز این مشکل و با کد زیر حل کردم . اگر کسی توضیحی داره در مورد این کد برای اطلاعات بیشتر ما و دوستان بفرمایید :


ListBox.CheckForIllegalCrossThreadCalls = false;

alibilgats
جمعه 08 خرداد 1394, 11:46 صبح
سلام دوست عزیز.
ممنون که جواب سوالتون رو اینجا به اشتراک گذاشتین.
ظاهرا این کد باعث میشه که در حالت فراخوانی کنترل داخل Thread از بررسی اتصالات همزمان چشم پوشی بشه!:لبخندساده:
امروز یه نکته جدید یادگرفتم و خوشحالم:چشمک:

mokamel
شنبه 09 خرداد 1394, 11:37 صبح
خواهش می کنم اما مطلب که شما گفتید دقیقا برگردان فارسی خود دستور هستش .
اگر بشه مکانیسم اجرایی اون و نحوه حل مشکل و کسی بگه عالیه

pouria_bayat
شنبه 09 خرداد 1394, 13:33 عصر
سلامکد زیر رو جایگزین خطی کن که ارور میده:
1.

var act = new Action(() =>
{
lisbox_link.Items.Add("sss");
});
if (lisbox_link.InvokeRequired)
lisbox_link.BeginInvoke(act);
else
act();

ebrahim.rayatparvar
شنبه 09 خرداد 1394, 14:42 عصر
سلام مهندس جان
برنامه اصلی خودش یه ترد اصلی داره وزمانی که اجرا میشه تمام کنترل ها رو چک میکنه و زمانی که شما می خواین از ترد دیگه به طور مستقیم از کنترل ها استفاده کنید ترد اصلی اجازه کار رو نمیده و کدی که شما استفاده کردید :


ListBox.CheckForIllegalCrossThreadCalls = false;

منظورش اینه که برنامه زمان اجرا دیگه این کنترل رو چک نکنه و خود مایکروسافت هم این نوع کد زدن رو قبول نداره بهتره برای حل مشکل خودت دنبال ره حل بهتری باشی.