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



1 Answers

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

Question

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

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




لديك لاستخدام معالجات 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();
}



Related