ارور در برنامه نویسی موازی- چند نخی
سلام وقت بخیر ، برای تمرین نخ یک کد ساده نوشتم بنظرتون چرا اجرا نمیشه؟
private void button2_Click(object sender, EventArgs e) {
ThreadStart t1 = new ThreadStart(test);
Thread childThread = new Thread(t1);
childThread.Start();
}
public void test()
{
for (int i = 0; i < 1000; i++)
{
comboBox1.Items.Add("test");
}
}
1 ضمیمه
نقل قول: ارور در برنامه نویسی موازی- چند نخی
داخل عکس ارور مشخصه ولی اگر بجای کد comboBox1.Items.Add("test") مثلا کد MessageBox.Show("Hello World!") بزارم اروری نمیده و اجرا میشه...
چرا این ارور میده؟
ضمیمه 153782
نقل قول: ارور در برنامه نویسی موازی- چند نخی
داخل یک فروم خارجی خوندم برای رفع ارور از کد زیر استفاده میکردن....
if (InvokeRequired)
{
this.Invoke(new MethodInvoker(delegate
{
//Your code here, like set text box content or get text box contents etc..
}));
}
else
{
// Your code here, like set text box content or get text box contents etc..
// SAME CODE AS ABOVE
}
}
یعنی کلاس من به شکل زیر میشه :
public void test() {
if (InvokeRequired)
{
this.Invoke(new MethodInvoker(delegate
{
for (int i = 0; i < 10; i++)
{
comboBox1.Items.Add("test");
}
}));
}
else
{
}
}
کسی میدونه این کد یعنی InvokeRequired چه کاری انجام میده؟ کلاس بالا برای من کار میکنه ولی قسمت else باید چیزی بنویسم؟
و مهمتر از همه، من میخوام اطلاعات از سورس 3سایت دربیارم،برای گرفتن سورس از http agility pack استفاده کردم و همچنین از ترد برای اینکه فرم برنامم هنگ نکنه...ولی موقع اجرای کد که میخواد چند رشته از بین تگ های سورس سایت دربیاره فرم برنامه هنگ میکنه...چرا هنگ میکنه؟
نقل قول: ارور در برنامه نویسی موازی- چند نخی
چون ui برنامه به طور مدام مشغول میشه
منطق دریافت و استخراخ رو در نخ مجزا انجام بدید و با invoke ظاهر برنامه رو یک بار و یا با فواصل زمانی آپدیت کنید.
البته
نقل قول: ارور در برنامه نویسی موازی- چند نخی
نقل قول:
نوشته شده توسط
gachboy
داخل عکس ارور مشخصه ولی اگر بجای کد comboBox1.Items.Add("test") مثلا کد
MessageBox.Show("Hello World!") بزارم اروری نمیده و اجرا میشه...
چرا این ارور میده؟
ضمیمه 153782
سلام
دوستمون جواب دادن .
نکته ی تکمیلی اینکه برای دسترسی به هیچ کنترل و یا اعضای زیر مجموعه اش ، نباید کدهای مربوط به اون کنترل (و یا اعضاش) را درون نخ جدیدی استفاده (فراخونی یا مقداردهی) کنید .
لینک زیر درباره wpf هست اما win form هم خیلی شبیه اش توی این قضیه هست (جواب سومی که با عنوانِ Threading Model in UI شروع میشه) :
C# - Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on - Stack Overflow