PDA

View Full Version : اجرای همزمان دو event



Raha323
یک شنبه 11 تیر 1391, 13:47 عصر
چطور توسطdelegateدو event را همزمان اجرا کنم
ممنون از دوستان

tooraj_azizi_1035
یک شنبه 11 تیر 1391, 14:27 عصر
سلام

سوال شما مربوط به ترکیب 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!

vof.ir
یک شنبه 11 تیر 1391, 14:28 عصر
هم زمان که ؛ به صورت صد در صد همزمان نیست قطعا یک ترتیب اجرایی دارند
شما دو متد مربوطه را به دلیگیت اضافه کرده اید؟

ahmadreza517
یک شنبه 11 تیر 1391, 15:21 عصر
به نام تنها برنامه نویس هستی
سلام ,

برای اجرای هم زمان چند پروسه می تونید از Thread استفاده کنید.

Saeed_m_Farid
یک شنبه 11 تیر 1391, 16:44 عصر
سلام

چطور توسطdelegateدو event را همزمان اجرا کنم...


سوال شما مربوط به ترکیب Delegate ها میشه (Multicast Delegates): ...


برای اجرای هم زمان چند پروسه می تونید از Thread استفاده کنید.
خواهشاً دوستان شاکی نشن، با احترام فراوان و عذرخواهی از اینکه جواب میدم! مگه با Delegate ا Event اجرا میکنن! یعنی چی؟ من روی سوال رو نمی‌تونم بفهمم :(
یک ربع هست دارم به روی سوال توجه می‌کنم، ولی هیچکدوم از برداشت های شما رو نمی‌تونم بکنم!

آخه نمونه کد شما چه ربطی داره به MulticastDelegate (http://msdn.microsoft.com/en-us/library/system.multicastdelegate.aspx)؟ باور کنید متوجه نمیشم که می‌پرسم، MulticastDelegate (http://msdn.microsoft.com/en-us/library/system.multicastdelegate.aspx) یه چیز دیگه است (به مثال انتهای لینک توجه کنید). این کلاس غیر قابل انشعاب، درون خودش یک لیست پیوندی داره که بهش میگن 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 (http://msdn.microsoft.com/en-us/library/system.multicastdelegate.aspx) هم هر چند Synchronous ولی بازم ترتیبی اجرا میشن، در هر حال مشکل اینه که همزمانی اینا رو چطور میخواید مدیریت کنید؟ مثلاً اگه فلان Event‌ اجرا نشده باشه، این‌یکی invoke نشه یا اگه Exception ای تو روند فراخوانی Event ها رخ بده، چطور می‌خواهید مدیریت کنید (چون تمام event های بعد اون هم دیگه از بین میرن) و ...

tooraj_azizi_1035
یک شنبه 11 تیر 1391, 19:08 عصر
آخه نمونه کد شما چه ربطی داره به MulticastDelegate (http://msdn.microsoft.com/en-us/library/system.multicastdelegate.aspx)؟


اگه منظورتون نمونه کد من هست که اگه ربطی نداشت که مایکروسافت اون رو به عنوان مثال برای درک مفهوم Multicast در سایت خودش قرار نمی داد!

اجرای همزمان یک چیز هست و اجرای پشت سر هم یک چیز دیگه.
برای اجرای پشت سرهم می توان از پیوند Delegate ها استفاده کرد.
برای اجرای همزمان باید از کلاس های مربوط به اجرای همزمان مثل Thread یا Task استفاده کرد.



مگه با Delegate ا Event اجرا میکنن! یعنی چی؟


بله با delegate رویداد اجرا می کنند می تونید به کد Designer فرم که اتوماتیک ساخته میشه نگاهی بیندازید. مثلاً با دابل کلیک روی فرم که رویداد Load رو میاره یک متغیر از نوع delegate در Designer اضافه میشه.



MulticastDelegate (http://msdn.microsoft.com/en-us/library/system.multicastdelegate.aspx) یه چیز دیگه است
شما بگید MultiCast چیست؟


این کدتون رو یکبار با دقت نگاه کنید؟ event ها کو؟ اونا که مستقیم صدا کردین چه ربطی به event دارن و ..
به جای متد های تعیین شده می تونیم event قرار بدیم فرقی نمی کنه!

Saeed_m_Farid
دوشنبه 12 تیر 1391, 00:48 صبح
فقط محض اطلاع، قصد دیگه ای ندارم:




اگه ربطی نداشت که مایکروسافت اون رو به عنوان مثال برای درک مفهوم Multicast در سایت خودش قرار نمی داد!
اجرای همزمان یک چیز هست و اجرای پشت سر هم یک چیز دیگه. برای اجرای پشت سرهم می توان از پیوند Delegate ها استفاده کرد.
برای اجرای همزمان باید از کلاس های مربوط به اجرای همزمان مثل Thread یا Task استفاده کرد.
با delegate رویداد اجرا می کنند می تونید به کد Designer فرم که اتوماتیک ساخته میشه نگاهی بیندازید. مثلاً با دابل کلیک روی فرم که رویداد Load رو میاره یک متغیر از نوع delegate در Designer اضافه میشه.
شما بگید MultiCast چیست؟
به جای متد های تعیین شده می تونیم event قرار بدیم فرقی نمی کنه!



خیلی خوب گفتین: "برای درک مفهوم Multicast"؛مشکل در اینجا ارتباط Multicast Delegate با چندین event هست، که من سعی کردم اون رو تشریح کنم؛ ضمناً من ارتباط کد شما با کلاس MulticastDelegate (http://msdn.microsoft.com/en-us/library/system.multicastdelegate.aspx) رو عرض کردم، نه درک مفهوم Multicast؛ من فکر کردم شما یک شیء از این کلاس می خواهید تعریف کنید، اگه اشتباه کردم عذر میخوام.
کاملاً درست هست، مگه من چیزی خلاف این فرمایش شما گفتم؟ ولی هیچ کاری در این مثال MSDN (کد شما) برای برآورده کردن این کار (اجرای همزمان) صورت نگرفته! یعنی کاری که این کد هم میکنه "اجرای پشت سر هم" هست، خوب بنظرم کار خاصی تو این مثال صورت نگرفته، فقط کاربرد عملگرها + و - که بقول خودتون یکنفر یکبار به کد Designer نگاه کنه، اولین چیزی که می بینه همین هست.
خوب دقیقاً سوال مربوط میشه به این قسمت! اگه صورت مساله این هست، پاسخ هم باید در این مورد باشه نه پیوند Delegate ها و ... (Subscribe and Unsubscribe (http://msdn.microsoft.com/en-us/library/ms366768))
نه دیگه، اینطوری نیست! اینکه تو Designer اتوماتیک به ازاء هر EventHandler یک نسخه از Delegate عمومی (نمونه delegate از System.EventHandler.EventHandler) درست میشه دلیل بر نادرستی این برداشت شما هست؛ Delegate رو شما می تونین مثل یه کلاس تصور کنید که اشیائی که از اون ساخته میشن، کار موردنظر رو انجام میدن؛ مثلاً EventHandler هایی که از یک کلاس Delegate ساخته میشن، مسئول مدیریت رویدادهایی هستن که باید Implement بشن؛ اون فقط یه چیزی مثل Function pointer هست، یه کلاس که زحمت همه کارهاش رو دات نت کشیده...
بازم میگم همونطورکه توضیح دادم، قصدم کلاس MulticastDelegate (http://msdn.microsoft.com/en-us/library/system.multicastdelegate.aspx) بوده و فکر نمیکنم کسی که چنین سوالی رو میپرسه ندونه 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 (http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx)
اگه هم نه که باید دقیق تر (فنی تر) بگین مشکل چیه؟
________________
دوستان عزیز و محترم، من اونهمه قبل پست ام خواهش کردم ناراحت نشیم، منظور بدی ندارم و ... چرا در مقابل هم گارد می گیریم؟ تو محیط علمی همه با هم با گوشزد کردن اشتباهات یا یادآوری مطالب فراموش شده به هم هست که پیشرفت میکنیم؛ شما اشتباه من رو میگین، من قبول میکنم . بالعکس؛ چرا باید ناراحت بشیم؟ مگه من اشتباه کردم معذرت نخواستم، اینطوری آدم میترسه هیچ پستی برنه یا اشتباهی (درست یا غلط) رو گوشزد کنه که مبادا کسی ناراحت بشه! خوب پس اصلاً واسه چی اومدیم این فروم، سرمون رو میکردیم تو کتابها و گوگل و ... ولی مزیت اینجا به همین هست که اگه اشتباه میکنیم بهمون بگن تا سریعتر پیشرفت کنیم...
بازم اگه من جایی اشتباه کردم بهم بگین تا تصحیح کنم.