.NET:Reflector中的Control Invoke()

时间:2010-05-09 19:03:06

标签: .net multithreading invoke .net-reflector

所以,我回到了一些.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的这一点,我想更多地了解正在发生的事情以及它是如何工作的。

哪里可以在.NET Reflector中找到Invoke()的代码?

3 个答案:

答案 0 :(得分:1)

这应该是评论,但不能在评论中编码格式......

如果您使用c#,这个故事可能会更简单......

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

答案 1 :(得分:1)

好吧,让我们列出你的例子中发生的所有事情。

  1. 您在那里展示的代码是cross-threading or multi-threading programing。(从dotnet开始存在)。
  2. 你的 rtfLog 正在使用InvokeRequired的标准功能 - 这是卑鄙的, rtfLog继承自Control类
    2.A. Control类是Winforms结构的一部分。
  3. 要达到“'我们不在同一个帖子中'的代码!”您需要创建两个或更多Threads
  4. 总体而言,反射器可以向您显示实施情况,但您可以在article中找到该想法。
    如果您想要查看实现,请编译一些简短的代码,例如“代码诗人”的答案,并在Reflector中查看他。(我查看这部分,反射器会向您显示非常接近的内容)你的原始代码。)

答案 2 :(得分:0)