因此,我回到了一些.NET编程中,并且通过VS.NET 2010中的新功能,它检测到了我试图从没有创建该控件的线程中修改控件的情况,并向我指出了关于您如何正确执行此操作的文章...

' 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

而且我很兴奋,因为我对如何执行此操作感到困惑,因为以前的版本vs.net没有标记这一点,因为我是一个项目的本科生,...

嗯...对不起。镇定恢复。无论如何,既然我知道了这一点.net-fu,我想进一步了解正在发生的事情及其工作方式。

在.NET反射器中,我在哪里可以找到Invoke()的代码?

有帮助吗?

解决方案

好吧,让命名您示例中发生的所有事情。

  1. 您显示的代码是 跨线程或多线程编程。(从dotnet的开头就存在)。
  2. 您的 rtflog 使用Invokerequired的标准功能 - 这是平均值, RTFLOG是从控制类继承的.
    2.A.控制类是Winforms结构的一部分。
  3. 要达到“我们不在同一线程中!”的代码。您需要创建两个或更多 线程.

总体而言,反射器可以向您显示实现,但是您可以在 文章.
如果您想查看实现实现,只需编译一些简短的代码,例如“代码诗人”答案,然后看他 反射器

其他提示

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

如果您使用C#,这个故事可能会变得更简单。

private void WriteLog(string text)
{
  if(InvokeRequired)
  {
    BeginInvoke(new MethodInvoker(()=>{ WriteLog(text); }));
  }
  else
  {
    rtfLog.AppendText(text);
  }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top