سؤال

لذلك ، كنت أعود إلى بعض البرمجة .NET ، ومن خلال ميزة جديدة في Vs.Net 2010 ، اكتشفت حالة كنت أحاول فيها تعديل عنصر تحكم من خيط لم يخلق هذا التحكم ، وأشارني إلى ذلك مقال عن MSDN حول كيفية القيام بذلك بشكل صحيح ...

' HOW TO WRITE TO A FORM CONTROL FROM A THREAD THAT DIDN'T CREATE THE CONTROL
' ===========================================================================
' Say you need to write to a UI text box that logs stuff...
Delegate Sub WriteLogDelegate(ByVal [text] As String)
Private Sub WriteLog(ByVal [text] As String)
    If Me.rtfLog.InvokeRequired Then
        ' We are not in the same thread!
        ' Create new WriteLogDelegate and invoke it on the same thread
        Dim d As New WriteLogDelegate(AddressOf WriteLog)
        Me.rtfLog.Invoke(d, New Object() {[text]})
    Else
        ' We are totally in the same thread...
        ' Call AppendText like normal!
        Me.rtfLog.AppendText([text])
    End If
End Sub

وكنت متحمسًا جدًا لأنني كنت في حيرة من كيفية القيام بذلك لمدة 5 سنوات لأن الإصدارات السابقة من Vs.Net لم تعلن عن هذا الأمر منذ أن كنت في المرحلة الجامعية الأولى في المشروع و ...

أم ... آسف على ذلك. استعاد رباطة جأش. على أي حال ، الآن بعد أن عرفت هذا الجزء من .NET-FU ، أود أن أتعلم المزيد حول ما يجري وكيف يعمل.

أين يمكنني العثور على رمز Invoke () في .NET Reflector؟

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

المحلول

حسنًا ، دع تسمية كل ما يحدث في مثالك.

  1. الرمز الذي تظهره هناك برمجة متقاطعة أو متعددة الخيوط. (الموجودة من بداية dotnet).
  2. لك rtflog يستخدم القدرات القياسية لـ Invokerequired - هذا يعني ، أن rtflog يرث من فئة التحكم.
    2.A. فئة التحكم هي جزء من بنية WinForms.
  3. للوصول إلى الكود الذي "نحن لسنا في نفس الموضوع!" تحتاج إلى إنشاء اثنين أو أكثر الخيوط.

بشكل عام ، يمكن للعاكس أن يوضح لك التنفيذ ، ولكن الفكرة التي يمكنك العثور عليها فيها مقالة - سلعة.
إذا ارتكبت أنك تريد رؤية التنفيذ ، فما عليك سوى تجميع بعض الرمز القصيرة مثل "Code Poet" ، وانظر إليه العاكس. (أتحقق من هذا الجزء ، سيظهر لك العاكس شيئًا يغلق رمزك الأصلي.)

نصائح أخرى

يجب أن يكون هذا تعليقًا ولكن لا يمكن تنسيق رمز في التعليقات هكذا ....

إذا كنت تستخدم C# يمكن أن تصبح هذه القصة أكثر بساطة ..

private void WriteLog(string text)
{
  if(InvokeRequired)
  {
    BeginInvoke(new MethodInvoker(()=>{ WriteLog(text); }));
  }
  else
  {
    rtfLog.AppendText(text);
  }
}

إليكم Control.invoke على MSDN: http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx

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