تحتاج مساعدة في الحصول على المعلومات عبر موضوع UI وموضوع آخر في C #

StackOverflow https://stackoverflow.com/questions/229254

سؤال

ولدي تطبيق الملقم الذي يتلقى المعلومات عبر الشبكة ويعالجها. الملقم متعددة الخيوط ويتعامل مع مآخذ متعددة في وقت ويتم إنشاء المواضيع دون إرادتي من خلال وسائل أسلوب BeginInvoke وEndInvoke، والتي بالسلاسل من قبل وظائف رد المقابلة.

وأنا أحاول لإنشاء نموذج، بالإضافة إلى واجهة المستخدم الرسومية الرئيسي، الذي يعرض عنصر مربع القائمة التي يسكنها البنود واصفا مآخذ متصل حاليا. لذلك، ما أحاول أساسا القيام به هو إضافة عنصر إلى مربع القائمة باستخدام وظيفتها إضافة ()، من موضوع وظيفة رد الاتصال المناسبة يعمل على. أنا إستخدام أشكال بلدي تسيطر من خلال الخاصية التحكم - أي بمعنى:

(ListBox)c.Controls["listBox1"].Items.Add();

وبطبيعة الحال أنا لا مجرد استدعاء الدالة، لقد حاولت عدة طرق وجدتها هنا وعلى شبكة الإنترنت للتواصل بين المواضيع، بما في ذلك MethodInvoker، وذلك باستخدام delegate، بالاشتراك مع Invoke()، BeginInvoke() الخ لا شيء يبدو على العمل، وأنا دائما الحصول على نفس استثناء تقول لي إرادتي تم الوصول إليها من موضوع آخر غير الذي تم إنشاؤه على.

وأي أفكار؟

هل كانت مفيدة؟

المحلول

لديك للاتصال استدعاء (أو BeginInvoke) على عنصر التحكم مربع القائمة التي يتم الوصول حتى يتسنى للمندوب ليتم استدعاؤها على موضوع التي خلقت تلك السيطرة.

ListBox listBox = c.Controls["listBox1"] as ListBox;
if(listBox != null)
{
   listBox.Invoke(...);
}

نصائح أخرى

ولقد استعملت دائما شيء على طول هذه الخطوط:

        c = <your control>
        if (c.InvokeRequired)
        {
            c.BeginInvoke((MethodInvoker)delegate
            {
                //do something with c
            });
        }
        else
        {
            //do something with c
        }

وكتبت أيضا مجموعة من طرق الإرشاد المساعد ل... مساعدة.

using System;
using System.ComponentModel;
public static class CrossThreadHelper
{
    public static bool CrossThread<T,R>(this ISynchronizeInvoke value, Action<T, R> action, T sender, R e)
    {
        if (value.InvokeRequired)
        {
            value.BeginInvoke(action, new object[] { sender, e });
        }

        return value.InvokeRequired;
    }
}

وتستخدم مثل هذا:

     private void OnServerMessageReceived(object sender, ClientStateArgs e)
    {
        if (this.CrossThread((se, ev) => OnServerMessageReceived(se, ev), sender, e)) return;
        this.statusTextBox.Text += string.Format("Message Received From: {0}\r\n", e.ClientState);
    }
<ع> استخدام BeginInvoke أو استدعاء يجب أن تعمل بشكل جيد. هل يمكن أن مرحلة ما بعد البرنامج القصير ولكن كاملة مما يدل على المشكلة؟ يجب أن تكون قادرة على العمل لمدة تصل واحد والتي لا تحتاج في الواقع أي أشياء من جانب الخادم - فقط لديك مجموعة من المواضيع التي "التظاهر" لتلقي الاتصالات الواردة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top