چطور توسطdelegateدو event را همزمان اجرا کنم
ممنون از دوستان
چطور توسطdelegateدو event را همزمان اجرا کنم
ممنون از دوستان
سلام
سوال شما مربوط به ترکیب Delegate ها میشه (Multicast Delegates):
delegate void Del(string s);
class TestClass
{
static void Hello(string s)
{
System.Console.WriteLine(" Hello, {0}!", s);
}
static void Goodbye(string s)
{
System.Console.WriteLine(" Goodbye, {0}!", s);
}
static void Main()
{
Del a, b, c, d;
// Create the delegate object a that references
// the method Hello:
a = Hello;
// Create the delegate object b that references
// the method Goodbye:
b = Goodbye;
// The two delegates, a and b, are composed to form c:
c = a + b;
// Remove a from the composed delegate, leaving d,
// which calls only the method Goodbye:
d = c - a;
System.Console.WriteLine("Invoking delegate a:");
a("A");
System.Console.WriteLine("Invoking delegate b:");
b("B");
System.Console.WriteLine("Invoking delegate c:");
c("C");
System.Console.WriteLine("Invoking delegate d:");
d("D");
}
}
Output
Invoking delegate a:
Hello, A!
Invoking delegate b:
Goodbye, B!
Invoking delegate c:
Hello, C!
Goodbye, C!
Invoking delegate d:
Goodbye, D!
هم زمان که ؛ به صورت صد در صد همزمان نیست قطعا یک ترتیب اجرایی دارند
شما دو متد مربوطه را به دلیگیت اضافه کرده اید؟
به نام تنها برنامه نویس هستی
سلام ,
برای اجرای هم زمان چند پروسه می تونید از Thread استفاده کنید.
سلام
خواهشاً دوستان شاکی نشن، با احترام فراوان و عذرخواهی از اینکه جواب میدم! مگه با Delegate ا Event اجرا میکنن! یعنی چی؟ من روی سوال رو نمیتونم بفهمم :(
یک ربع هست دارم به روی سوال توجه میکنم، ولی هیچکدوم از برداشت های شما رو نمیتونم بکنم!
آخه نمونه کد شما چه ربطی داره به MulticastDelegate؟ باور کنید متوجه نمیشم که میپرسم، MulticastDelegate یه چیز دیگه است (به مثال انتهای لینک توجه کنید). این کلاس غیر قابل انشعاب، درون خودش یک لیست پیوندی داره که بهش میگن invocation list و حاوی لیستی از delegate های شما هست و به ترتیبی که شما لیست تون رو بهش اضافه کردین، اون delegate ها رو فراخوانی میکنه و اصلاً شبیه چیزی نیست که شما نوشتین! این کدتون رو یکبار با دقت نگاه کنید؟ event ها کو؟ اونا که مستقیم صدا کردین چه ربطی به event دارن و ...
__________
اگه منظور اینه که چند تا Event Handler از نوع Delegate تون ایجاد کنید، که محدودیتی تو اینکار نیست (میتونید Delegate رو عین یه کلاس درنظر بگیرید که هرچند تا خواستید میشه ازش هندلر ساخت)؛ برای هر Event میتونید یه EventHandler تعریف کنید:
public delegate void MyEventHandler(object sender, StartEventArgs e);
...
public class Sender {
public event MyEventHandler BeforeStart;
public event MyEventHandler Handler_1;
//...
public event MyEventHandler Handler_n;
public event MyEventHandler AfterStart;
//...
}
و همونطورکه دوستمون اشاره کردن:
اصلاً نیم درصد هم همزمان نیستن! حتی در MulticastDelegate هم هر چند Synchronous ولی بازم ترتیبی اجرا میشن، در هر حال مشکل اینه که همزمانی اینا رو چطور میخواید مدیریت کنید؟ مثلاً اگه فلان Event اجرا نشده باشه، اینیکی invoke نشه یا اگه Exception ای تو روند فراخوانی Event ها رخ بده، چطور میخواهید مدیریت کنید (چون تمام event های بعد اون هم دیگه از بین میرن) و ...
اگه منظورتون نمونه کد من هست که اگه ربطی نداشت که مایکروسافت اون رو به عنوان مثال برای درک مفهوم Multicast در سایت خودش قرار نمی داد!آخه نمونه کد شما چه ربطی داره به MulticastDelegate؟
اجرای همزمان یک چیز هست و اجرای پشت سر هم یک چیز دیگه.
برای اجرای پشت سرهم می توان از پیوند Delegate ها استفاده کرد.
برای اجرای همزمان باید از کلاس های مربوط به اجرای همزمان مثل Thread یا Task استفاده کرد.
بله با delegate رویداد اجرا می کنند می تونید به کد Designer فرم که اتوماتیک ساخته میشه نگاهی بیندازید. مثلاً با دابل کلیک روی فرم که رویداد Load رو میاره یک متغیر از نوع delegate در Designer اضافه میشه.مگه با Delegate ا Event اجرا میکنن! یعنی چی؟
شما بگید MultiCast چیست؟MulticastDelegate یه چیز دیگه است
به جای متد های تعیین شده می تونیم event قرار بدیم فرقی نمی کنه!این کدتون رو یکبار با دقت نگاه کنید؟ event ها کو؟ اونا که مستقیم صدا کردین چه ربطی به event دارن و ..
فقط محض اطلاع، قصد دیگه ای ندارم:
- خیلی خوب گفتین: "برای درک مفهوم Multicast"؛مشکل در اینجا ارتباط Multicast Delegate با چندین event هست، که من سعی کردم اون رو تشریح کنم؛ ضمناً من ارتباط کد شما با کلاس MulticastDelegate رو عرض کردم، نه درک مفهوم Multicast؛ من فکر کردم شما یک شیء از این کلاس می خواهید تعریف کنید، اگه اشتباه کردم عذر میخوام.
- کاملاً درست هست، مگه من چیزی خلاف این فرمایش شما گفتم؟ ولی هیچ کاری در این مثال MSDN (کد شما) برای برآورده کردن این کار (اجرای همزمان) صورت نگرفته! یعنی کاری که این کد هم میکنه "اجرای پشت سر هم" هست، خوب بنظرم کار خاصی تو این مثال صورت نگرفته، فقط کاربرد عملگرها + و - که بقول خودتون یکنفر یکبار به کد Designer نگاه کنه، اولین چیزی که می بینه همین هست.
- خوب دقیقاً سوال مربوط میشه به این قسمت! اگه صورت مساله این هست، پاسخ هم باید در این مورد باشه نه پیوند Delegate ها و ... (Subscribe and Unsubscribe)
- نه دیگه، اینطوری نیست! اینکه تو Designer اتوماتیک به ازاء هر EventHandler یک نسخه از Delegate عمومی (نمونه delegate از System.EventHandler.EventHandler) درست میشه دلیل بر نادرستی این برداشت شما هست؛ Delegate رو شما می تونین مثل یه کلاس تصور کنید که اشیائی که از اون ساخته میشن، کار موردنظر رو انجام میدن؛ مثلاً EventHandler هایی که از یک کلاس Delegate ساخته میشن، مسئول مدیریت رویدادهایی هستن که باید Implement بشن؛ اون فقط یه چیزی مثل Function pointer هست، یه کلاس که زحمت همه کارهاش رو دات نت کشیده...
- بازم میگم همونطورکه توضیح دادم، قصدم کلاس MulticastDelegate بوده و فکر نمیکنم کسی که چنین سوالی رو میپرسه ندونه Multicast یعنی ارسال پیغام (اطلاعات) با هم (simultaneously) به گروهی از گیرندههای مقصد!
- به جای متدهای تعیین شده event قرار بدیم، میشه Event Handling؟ پس EventArgs ، event invocation، Raise و ... چی میشه؟ همه این کارها رو هم بکنیم (از روی یه Tutorial ساده)، بازم روی مساله یه چیز دیگه بود!
+=+=+=+=+=+=+=+=+=+=+=+=
اگه منظور دوست ما اجرای Asynchronous بقول استادمون تورج خان Multicast Delegate هست، بعد اینکه شما EventHandler هاتو رو درست کردین و به شیء موردنظرتون انتساب دادن (مثلاً multicast) باید از متدهای BeginInvoke و EndInvoke استفاده کنید و برای بدست آوردن لیست EventHandlerهای اضافه شده هم از GetInvocationList، مثلاً چیزی مثل کد زیر:
foreach (MyDelegate action in multicast.GetInvocationList())
{
action.BeginInvoke(...);
}
همونطورکه قبلاً هم گفتم، من دقیقاً صورتِ سوال شما رو نگرفتم و نفهمیدم مشکل تون کجا بود؟ اگه در اجرای همزمان مشکل دارید، این رو بخونید: Calling Synchronous Methods Asynchronously
اگه هم نه که باید دقیق تر (فنی تر) بگین مشکل چیه؟
________________
دوستان عزیز و محترم، من اونهمه قبل پست ام خواهش کردم ناراحت نشیم، منظور بدی ندارم و ... چرا در مقابل هم گارد می گیریم؟ تو محیط علمی همه با هم با گوشزد کردن اشتباهات یا یادآوری مطالب فراموش شده به هم هست که پیشرفت میکنیم؛ شما اشتباه من رو میگین، من قبول میکنم . بالعکس؛ چرا باید ناراحت بشیم؟ مگه من اشتباه کردم معذرت نخواستم، اینطوری آدم میترسه هیچ پستی برنه یا اشتباهی (درست یا غلط) رو گوشزد کنه که مبادا کسی ناراحت بشه! خوب پس اصلاً واسه چی اومدیم این فروم، سرمون رو میکردیم تو کتابها و گوگل و ... ولی مزیت اینجا به همین هست که اگه اشتباه میکنیم بهمون بگن تا سریعتر پیشرفت کنیم...
بازم اگه من جایی اشتباه کردم بهم بگین تا تصحیح کنم.
آخرین ویرایش به وسیله Saeed_m_Farid : دوشنبه 12 تیر 1391 در 16:05 عصر دلیل: دوستانه