Domanda

Così, mi è stato sempre di nuovo in po 'di programmazione .NET, e attraverso una nuova funzionalità in VS.NET 2010, ha rilevato un caso in cui stavo cercando di modificare un controllo da un filo che non ha creato quel controllo, e mi ha segnalato un articolo su MSDN su come si esegue questa operazione in modo corretto ...

' 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

E io ero così eccitato perché io sono stato perplesso da come fare questo per come 5 anni a causa versioni precedenti di vs.net non segnalare questo fin da quando ero un undergrad su un progetto e ...

Umm ... Siamo spiacenti bout che. Compostezza riacquistato. Ad ogni modo, ora che so questo po 'di NET-fu, mi piacerebbe saperne di più su quello che sta succedendo e come funziona.

Dove posso trovare il codice per Invoke () in .NET Reflector?

È stato utile?

Soluzione

Bene, lasciate citarne tutto cosa che accade nel tuo esempio.

  1. Il codice che vi mostra c'è cross-threading o multi-threading programmazione . (che esiste dall'inizio del dotnet).
  2. rtfLog è tramite le funzionalità standard di InvokeRequired -. Questa è la media, che rtfLog eredita dalla classe Control
    2.a. classe di controllo è parte della struttura WinForms.
  3. Per raggiungere il codice che "' Non siamo nello stesso thread!" è necessario creare due o più Fili .

Nel complesso, il riflettore in grado di mostrare l'attuazione, ma l'idea si può trovare in articolo .
Se Shure che si vuole vedere l'attuazione, basta compilare un codice breve come in "codice poeta" risposta, e guardarlo in Reflector . (verifico questa parte, il riflettore vi mostrerà qualcosa che abbastanza vicino il codice originale.)

Altri suggerimenti

Questo dovrebbe essere un commento, ma non può formato di codice nei commenti così ....

Se si sta utilizzando C # questa storia potrebbe ottenere ancora più semplice ..

private void WriteLog(string text)
{
  if(InvokeRequired)
  {
    BeginInvoke(new MethodInvoker(()=>{ WriteLog(text); }));
  }
  else
  {
    rtfLog.AppendText(text);
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top