2013-02-15 1 views
0

Я читал через Интернет, как решить проблему обновления элементов управления из разных потоков, чем тот, который содержит элемент управления, а также читать «Pro VB 2010 и платформу .NET 4.0», и я начинаю задаваться вопросом. Выполняется ли синхронно следующий код?Управление асинхронным обновлением

Private Sub SaveData(ByVal filepath As String) 
    If InvokeRequired Then 
     Me.Invoke(New MethodInvoker(AddressOf SaveData)) 
    Else 
     ... the actual code 
    End If 
End Sub 
+0

Я смущен. Каков ваш реальный вопрос? –

+0

Вы хотите знать, может ли этот код работать с несколькими потоками, используя его без проблем? – Simon

ответ

0

Это зависит от вашего контекста вызова.

Если вы вызываете его из потока пользовательского интерфейса или основного потока, тогда да, он будет работать синхронно.

Если вы вызываете это из потока, который не является вашим пользовательским интерфейсом или основным потоком, он будет работать асинхронно с вашим пользовательским интерфейсом или основным потоком, но синхронно с вызывающим потоком, ожидая завершения пользовательского интерфейса или основного потока обработки делегата.

Так что это может идти в обоих направлениях. Он может работать синхронно и асинхронно. Я думаю, что вам не хватает того, что сам код не преформируется синхронно или асинхронно, выполнение кода либо синхронно, либо асинхронно.

Причина, почему вы делаете функцию обновления:

Private Sub UpdateLabel(byval tLabel as Label, byval Value as String) 
    If tLabel.Invokerequired Then 
     Me.Invoke(New MethodInvoker(AddressOf UpdateLabel) 
    Else 
     tLabel.Text = Value 
    End If 
End Sub 

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

Этот метод можно было бы безопасно вызывать из потока пользовательского интерфейса во время события клика, а также было бы безопасно звонить из бегущего фонового потока, поскольку изменение все равно будет выполняться только в пользовательском интерфейсе или основном потоке. Вы используете такой код, чтобы обеспечить синхронизацию с вашими изменениями в элементах управления, принадлежащих другим потокам.

Этот стиль обновления предназначен для синхронизации ваших изменений и предотвращения перекрестной резьбы.

0

Метод Invoke - это синхронный вызов, который блокирует вызывающий поток, пока делегат не завершит выполнение в потоке пользовательского интерфейса.

Если вы хотите вызвать поток для продолжения сразу (перед тем, как выполняется код в потоке пользовательского интерфейса), вызовите BeginInvoke(), который является асинхронным.