c# - في.NET ، ما مؤشر ترابط الأحداث التي سيتم التعامل معها؟




events multithreading delegates (5)

ما لم تقم بتنظيم نفسك ، سيتم تنفيذ الحدث على أي مؤشر يستدعي ذلك ؛ لا يوجد شيء خاص حول الطريقة التي يتم بها استدعاء الأحداث ، ولا يحتوي مؤشر ترابط منتجك على معالج أحداث ، فقال منتجك ببساطة "يا ، عند إطلاق هذا الحدث ، اتصل بهذه الوظيفة". لا يوجد شيء في ذلك يؤدي تنفيذ الحدث إلى حدوث على مؤشر ترابط BeginInvoke ولا على مؤشر الترابط الخاص به (إلا إذا كنت تستخدم BeginInvoke بدلاً من استدعاء المفوض الحدث بشكل عادي ولكن هذا سيؤدي فقط إلى تنفيذ على ThreadPool ).

لقد حاولت تنفيذ نمط منتج / مستهلك في c #. لدي مؤشر ترابط المستهلك الذي يراقب قائمة انتظار مشتركة ، وهو مؤشر ترابط منتج يضع العناصر في قائمة الانتظار المشتركة. يتم الاشتراك في مؤشر ترابط المنتج لتلقي البيانات ... بمعنى ، أنه يحتوي على معالج أحداث ، ويجلس فقط وينتظر إطلاق حدث OnData (يتم إرسال البيانات من واجهة مستخدم طرف ثالث). عندما تحصل على البيانات ، فإنها تلتصق بها في الطابور حتى يتمكن المستهلك من التعامل معها.

عندما ينطلق حدث OnData في المنتج ، كنت أتوقع أن يتم التعامل معه من خلال مؤشر ترابط المنتج. لكن هذا لا يبدو أن ما يحدث. يبدو الحدث OnData كما لو أنه يتم التعامل معه على مؤشر ترابط جديد بدلاً من ذلك! هل هذه هي الطريقة التي يعمل بها .net دائمًا ... يتم التعامل مع الأحداث على سلسلة المحادثات الخاصة بهم؟ هل يمكنني التحكم في الموضوع الذي سيعالج الأحداث عندما يتم رفعها؟ ماذا لو أن المئات من الأحداث التي يتم جمعها بالقرب من الوقت نفسه ... سيكون لكل منها خيط خاص به؟


إن رفع حدث مع Invoke هو نفس استدعاء الأسلوب - يتم تنفيذه في نفس الخيط الذي قمت برفعه.

رفع حدث مع BeginInvoke يستخدم ThreadPool . فيما يلي بعض التفاصيل البسيطة


لديك لاستخدام معالجات autoreetetent لهذه المشكلة ..... في autoreetetent عندما produses المنتج تعيين إشارة ثم المستهلك إعادة تعيين إشاراتها واستهلاكها .. بعد استهلاك مجموعة إشارة ثم أنتج المنتج الوحيد ...

AutoResetEvent pro = new AutoResetEvent(false);
AutoResetEvent con = new AutoResetEvent(true);

public void produser()
{

    while(true)
    {
        con.WaitOne();

        pro.Set();
    }
}

public void consumer()
{
    while (true)
    {
    pro.WaitOne();
       .................****

    con.Set();
    }
}

private void button1_Click(object sender, EventArgs e)
{
    Thread th1 = new Thread(produser);
    th1.Start();
    Thread th2 = new Thread(consumer);
    th2.Start();
}

بعد إعادة قراءة السؤال ، أعتقد أنني أفهم المشكلة الآن. لقد حصلت على شيء من هذا القبيل في الأساس:

class Producer
{
    public Producer(ExternalSource src)
    {
        src.OnData += externalSource_OnData;
    }

    private void externalSource_OnData(object sender, ExternalSourceDataEventArgs e)
    {
        // put e.Data onto the queue
    }
}

ثم لديك سلسلة من المستهلكين تسحب الأشياء من قائمة الانتظار هذه. المشكلة هي أن الحدث OnData يتم تشغيله بواسطة كائن مصدر ExternalSource - في أي مؤشر ترابط يحدث تشغيله.

إن event C # هو في الأساس مجرد مجموعة سهلة الاستخدام من المندوبين و "إطلاق" حدث ما فقط يتسبب في تشغيل حلقة التشغيل خلال جميع المندوبين وإطلاقها في وقت واحد.

لذلك يتم استدعاء معالج الحدث OnData الخاص بك على أي موضوع يتم تشغيل ExternalSource عليه.






c# .net events multithreading delegates