Frage

Also, ich war immer wieder in eine .NET-Programmierung, und durch ein neues Feature in VS.NET 2010 erfasst einen Fall, wo ich versuche, wurde eine Steuerung von einem Thread zu ändern, die nicht, dass die Kontrolle erstellt hat, und wies mich auf einen Artikel auf MSDN darüber, wie Sie dies richtig tun ...

' 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

Und ich war so aufgeregt, weil ich gewesen verwirrte durch, wie dies für wie 5 Jahre zu tun, weil frühere Versionen von vs.net hätten das nicht Flagge, da ich ein Grundstudium an einem Projekt war und ...

Umm ... Sorry Bout, dass. Wieder beruhigt. Wie dem auch sei jetzt, dass ich dieses Stück .NET-fu wissen, würde Ich mag mehr darüber erfahren, was los ist und wie es funktioniert.

Wo kann ich den Code für Invoke () in .NET Reflector finden?

War es hilfreich?

Lösung

Nun, lassen Sie alles, was Name, der in Ihrem Beispiel geschieht.

  1. Der Code, der Ihnen zeigt, gibt es Verkanten oder Multi-Threading programing . (die von Anfang des dotnet existieren).
  2. rtfLog wird unter Verwendung von Standard-Funktionen von InvokeRequired -. Das ist gemein, , dass rtfLog von Control-Klasse erbt
    2.a Control-Klasse ist ein Teil von WinForms-Struktur.
  3. , um den Code zu erreichen, dass „‘ Wir sind nicht im selben Thread!“ Sie benötigen zwei oder mehr Themen erstellen.

Insgesamt kann der Reflektor Dir die Implementierung zeigen, aber die Idee kann man in Reflector . (ich diesen Teil überprüfen, zeigt der Reflektor Sie etwas, das ganz in der Nähe Ihrer ursprünglichen Code.)

Andere Tipps

Dies sollte ein Kommentar sein kann aber nicht Code-Format in den Kommentaren so ....

Wenn Sie c # wurden mit dieser Geschichte könnte noch einfacher ..

erhalten
private void WriteLog(string text)
{
  if(InvokeRequired)
  {
    BeginInvoke(new MethodInvoker(()=>{ WriteLog(text); }));
  }
  else
  {
    rtfLog.AppendText(text);
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top