.NET: управление вызывает () в отражателе

Так, я возвращался в некоторое программирование.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 не отметили это, так как я был старшекурсником на проекте и...

Umm... Жаль поединок это. Самообладание возвращено. Так или иначе, теперь, когда я знаю этот бит.NET-fu, я хотел бы узнать больше о том, что продолжается и как он работает.

Где я могу найти, что код для Вызывает () в Отражателе.NET?

1
задан Avram 9 May 2010 в 22:58
поделиться

3 ответа

Давайте назовем все, что происходит в вашем примере.

  1. Код, который вы показываете, представляет собой многопоточное или многопоточное программирование . (Которые существуют с начала dotnet).
  2. Ваш rtfLog использует стандартные возможности InvokeRequired - это означает, , что rtfLog наследуется от класса Control .
    2.a. Класс управления является частью структуры Winforms.
  3. Чтобы достичь кода, который говорит: «Мы не в одном потоке!» вам нужно создать две или более потоков .

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

1
ответ дан 3 September 2019 в 00:42
поделиться

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

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

private void WriteLog(string text)
{
  if(InvokeRequired)
  {
    BeginInvoke(new MethodInvoker(()=>{ WriteLog(text); }));
  }
  else
  {
    rtfLog.AppendText(text);
  }
}
1
ответ дан 3 September 2019 в 00:42
поделиться
0
ответ дан 3 September 2019 в 00:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: