PDA

View Full Version : Cross-thread operation not valid در ايجاد event



reza_mostafavi63
شنبه 17 اردیبهشت 1390, 15:26 عصر
با سلام به دوستان مشكل من در ايجاد يك event براي كلاسي هست كه طراحي كردم . تنها چيزي هم كه ميخوام اينه كه به صورت عادي (مثل event هاي Button , Timer , TextBox, ...) باهاش تو برنامه كار كنم . ولي نميدونم اشكال كدم كجاس
كدها به صورت زير تعريف شده اند :


class Class1
{
public delegate void Class1Handle(int i);
public event Class1Handle ShowNumber;

public Class1()
{
Thread T1 = new Thread(new ThreadStart(StartWorking));
T1.IsBackground = true;
T1.Start();
}

int i = 0;
void StartWorking()
{
while (true)
{
Thread.Sleep(100);
ShowNumber(i++);
}
}

}


اينم كد فرم اصلي :



namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Class1 C1 = new Class1();
C1.ShowNumber += new Class1.Class1Handle(C1_ShowNumber);
}

void C1_ShowNumber(int i)
{
Text = i.ToString();
}
}
}



متاسفانه در هنگام اجرا با خطاي Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on. مواجه ميشم .


چرا نميتونم عين كامپوننت هاي ديگه از Event تش استفاده كنم ؟؟؟؟؟؟؟؟؟؟؟؟؟؟http://forum.p30world.com/images/New-smile/N_aggressive%20%282%29.gif

Mer28+2

tabatabaeefar
شنبه 17 اردیبهشت 1390, 17:21 عصر
سلام
یه خورده توی سایت میگشتی پیدا می کردی.


Control.CheckForIllegalCrossThreadCalls = False

اینو اول برنامت بنویس
فکر نکنم اصولی باشه اما دیگه اشکال نمیگیره

haghft
شنبه 17 اردیبهشت 1390, 17:25 عصر
ببینید این مربوط به بحث چند نخی میشه که یک نخ نمیتونه به روش عادی به اجزای یه نخ دیگه دسترسی داشته باشه شما اون قسمت هایی رو که دیباگر این ارور رو میده بدین صورت بنویسید:
Invoke(new MethodInvoker(delegate {کدی که دیباگر روش ارور میده}));

reza_mostafavi63
شنبه 17 اردیبهشت 1390, 18:38 عصر
]False
[/FONT][/COLOR][/SIZE][/FONT][/CODE]
اینو اول برنامت بنویس
فکر نکنم اصولی باشه اما دیگه اشکال نمیگیره

چرا اصولي نيست ؟؟ راه بهتر چيه ؟؟؟

reza_mostafavi63
شنبه 17 اردیبهشت 1390, 18:42 عصر
ببینید این مربوط به بحث چند نخی میشه که یک نخ نمیتونه به روش عادی به اجزای یه نخ دیگه دسترسی داشته باشه شما اون قسمت هایی رو که دیباگر این ارور رو میده بدین صورت بنویسید:
Invoke(new MethodInvoker(delegate {کدی که دیباگر روش ارور میده}));

اين روش هم كار كرد ولي Invoke فقط روي كنترل (فرم) كار ميكنه . و نوشتن اين كد براي دستورات ، خانايي برنامه را كم ميكنه . من ميخوام همه كد هاي اضافي داخل كلاس تعريف بشن و از ديد برنامه نويس مخفي بمونه . و برنامه نويس مثل كامپوننت هاي ديگه مثل timer ، به راحتي از event استفاده كنه

خود دات نت چه طوري اين كار رو ميكنه ؟؟؟؟؟؟؟؟؟

haghft
شنبه 17 اردیبهشت 1390, 19:54 عصر
مجبوری از خوانایی کد کمی بزنی!