Question

Alors, je devenais de nouveau dans une programmation .NET, et grâce à une nouvelle fonctionnalité dans VS.NET 2010, il a détecté un cas où je tentais de modifier un contrôle à partir d'un fil qui ne crée que le contrôle et m'a fait un article sur MSDN sur la façon dont vous le faites correctement ...

' 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

Et j'étais tellement excitée parce que je suis perplexe comment faire pour comme cinq années parce que les versions précédentes de vs.net ne faiblit pas depuis que je suis un étudiant de premier cycle sur un projet et ...

Umm ... Désolé combat qui. a retrouvé le calme. Quoi qu'il en soit, maintenant que je sais que ce peu de .NET-fu, je voudrais en savoir plus sur ce qui se passe et comment il fonctionne.

Où puis-je trouver le code pour Invoke () dans .NET réflecteur?

Était-ce utile?

La solution

Eh bien, nous allons nommer tout chose qui se passe dans votre exemple.

  1. Le code que vous montrant qu'il est cross-threading ou multi-threading programmation . (qui existe depuis le début du dotnet).
  2. rtfLog utilise les capacités standard de InvokeRequired -. C'est moyenne, rtfLog hérite de la classe de contrôle 2.a. classe de contrôle fait partie de la structure Winforms.
  3. Pour atteindre le code » Nous ne sommes pas dans le même fil!" vous devez créer deux ou plus Threads .

Dans l'ensemble, le réflecteur peut vous montrer la mise en œuvre, mais l'idée que vous pouvez trouver dans réflecteur . (je vérifie cette partie, le réflecteur vous montrer quelque chose que peu près votre code d'origine.)

Autres conseils

Cela devrait être un commentaire mais ne peut pas le format de code dans les commentaires si ....

Si vous utilisez c # cette histoire pourrait encore plus simple ..

private void WriteLog(string text)
{
  if(InvokeRequired)
  {
    BeginInvoke(new MethodInvoker(()=>{ WriteLog(text); }));
  }
  else
  {
    rtfLog.AppendText(text);
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top