Вопрос

Итак, я вернулся в некоторые .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 Refluer?

Это было полезно?

Решение

Ну, позвольте назвать все, что происходит в вашем примере.

  1. Код, который вы показываете там Перекрестная или многопоточная программирование, (это существует от начала dotnet).
  2. Твой rtflog. использует стандартные возможности invokeerequirepiredired - это подлое, что RTFLOG наследует от класса управления.
    2. Класс управления является частью структуры WinForms.
  3. Чтобы достичь кода, что «мы не в том же ниве!» вам нужно создать два или более Потоки.

В целом, отражатель может показать вам реализацию, но идея, в которой вы можете найти в статья.
Если вы уйдите, что хотите увидеть реализацию, просто составьте немного короткого кода, как в «Code Poet», и посмотрите на него в Отражатель, (Я проверю эту часть, отражатель покажет вам то, что довольно близко ваш оригинальный код.)

Другие советы

Это должно быть комментарий, но не может кодировать формат в комментариях так ....

Если бы вы использовали C # Эта история может быть еще проще ..

private void WriteLog(string text)
{
  if(InvokeRequired)
  {
    BeginInvoke(new MethodInvoker(()=>{ WriteLog(text); }));
  }
  else
  {
    rtfLog.AppendText(text);
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top