.NET: Согласование управления () в отражателе
-
04-10-2019 - |
Вопрос
Итак, я вернулся в некоторые .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?
Решение
Ну, позвольте назвать все, что происходит в вашем примере.
- Код, который вы показываете там Перекрестная или многопоточная программирование, (это существует от начала dotnet).
- Твой rtflog. использует стандартные возможности invokeerequirepiredired - это подлое, что RTFLOG наследует от класса управления.
2. Класс управления является частью структуры WinForms. - Чтобы достичь кода, что «мы не в том же ниве!» вам нужно создать два или более Потоки.
В целом, отражатель может показать вам реализацию, но идея, в которой вы можете найти в статья.
Если вы уйдите, что хотите увидеть реализацию, просто составьте немного короткого кода, как в «Code Poet», и посмотрите на него в Отражатель, (Я проверю эту часть, отражатель покажет вам то, что довольно близко ваш оригинальный код.)
Другие советы
Это должно быть комментарий, но не может кодировать формат в комментариях так ....
Если бы вы использовали C # Эта история может быть еще проще ..
private void WriteLog(string text)
{
if(InvokeRequired)
{
BeginInvoke(new MethodInvoker(()=>{ WriteLog(text); }));
}
else
{
rtfLog.AppendText(text);
}
}
Вот control.invoke на MSDN: http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx.