.NET: التحكم في الاستدعاء () في العاكس
-
04-10-2019 - |
سؤال
لذلك ، كنت أعود إلى بعض البرمجة .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؟
المحلول
حسنًا ، دع تسمية كل ما يحدث في مثالك.
- الرمز الذي تظهره هناك برمجة متقاطعة أو متعددة الخيوط. (الموجودة من بداية dotnet).
- لك rtflog يستخدم القدرات القياسية لـ Invokerequired - هذا يعني ، أن rtflog يرث من فئة التحكم.
2.A. فئة التحكم هي جزء من بنية WinForms. - للوصول إلى الكود الذي "نحن لسنا في نفس الموضوع!" تحتاج إلى إنشاء اثنين أو أكثر الخيوط.
بشكل عام ، يمكن للعاكس أن يوضح لك التنفيذ ، ولكن الفكرة التي يمكنك العثور عليها فيها مقالة - سلعة.
إذا ارتكبت أنك تريد رؤية التنفيذ ، فما عليك سوى تجميع بعض الرمز القصيرة مثل "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