PDA

View Full Version : سوال: مشکل در Invoke



masoud.a
سه شنبه 03 مرداد 1391, 16:25 عصر
سلام
یه سری مشکل با مفهوم Invoke داشتم.میخواستم بدونم واسه برطرف کردن این مشکل چه چیزهائی رو باید بخونم؟ Delegate رو خوندم که اونجا یه کم در مورد Invoke گفته بود ولی تو برنامه متوجه نمیشم چطوری استفاده میکنه ازش.از threading باید بدونم.درسته؟آخه تو کامنت یه قسمت برنامه میگه چون در thread متفاوتی هست تر invoke استفاده میکنیم.


SetTextCallback d = new SetTextCallback(SetSmallMessage
this.Invoke(d,new object[] {this.labelMessageSmall>text+Response.ToString("X2")+ " " });]

the king
سه شنبه 03 مرداد 1391, 23:25 عصر
قضیه اینه، فرضا وقتی در یک Thread که داره اجرا میشه فرمی ساخته میشه، تمامی عملیات نمایشی و غیر نمایشی داخل اون فرم به اون Thread سپرده میشه
و به دلیل ماهیت فرم های ویندوز، سایر Thread ها نباید در این روند دخالت مستقیمی داشته باشند. اگر Thread دیگری بخواهد کاری انجام بدهد که
از اختیارات خودش خارج است و مسئول آن کار Thread دیگری است، باید بجای اجرا کردن مستقیم اونکار با Invoke از Thread مسئول درخواست کند
که بجایش فلان کار را انجام دهد. اگر برنامه شما چندین Thread داشته باشد احتمال دارد درگیر این مساله بشوید.

مثال اول : Thread جدیدی بی اجازه و مستقیما سعی می کند عنوان فرم را تغییر دهد، اما چون این Thread اصلی نیست و این اجازه را ندارد برنامه با خطا متوقف می شود :

private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(MyJob);
t.Start(null);
}

private void MyJob(object data)
{
this.Text = "Hello";
}


مثال دوم : Thread جدید سر عقل آمده و از Thread اصلی که فرم را کنترل می کند و دسترسی لازم را دارد درخواست می کند که بی زحمت عنوان فرم را به نیابت از من تغییر دهید :

private delegate void ChangeText(string text);

private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(MyJob);
t.Start(null);
}

private void MyJob(object data)
{
this.Invoke(new ChangeText(SetText), "Hello");
}

private void SetText(string text)
{
Text = text;
}


در کد دوم دو چیز به کد اضافه شده، یک delegate ای که مناسب کار هست مثلا ChangeText که یک متنی رو عنوان جدید قرار بده.
و مورد دومی متدی که Thread اصلی با اون کاری رو انجام بده که می خواهیم، مثل SetText که عنوان فرم رو عوض می کنه.
وجود SetText به این دلیله که نمی توانید از Thread اصلی درخواستی را بکنید که تمایلی به انجام اش را ندارد، باید آن خدمت
را ارائه کند تا بتوانید درخواست اش کنید.