Синхронизация части кода в ожидании возврата ShowDialog - PullRequest
2 голосов
/ 01 июня 2010

Мне не удается решить, как заблокировать приложение из раздела кода, пока оно ожидает ответа от внешней программы

Я использовал Synclock в разделе кода с объектом Me в выражении. В этом Synclock я вызываю переопределенный метод ShowDialog диалогового окна, которое имеет параметр тайм-аута, но возвращает значение из базового вызова функции ShowDialog после настройки таймера. Работает так.

    SyncLock Me
        Dim frmDlgWithTimeout As New frmDlgWithTimeout ' dialog box with overridden ShowDialog '
        Dim res As DialogResult = frmDlgWithTimeout.ShowDialog(10 * 1000) ' 10 sec timeout '
    End SyncLock

Теперь внешние программы могут вызывать события, которые приводят мое приложение к этому Synclock, но это не мешает ему войти в него, даже если функция ShowDialog не вернула значение (и, следовательно, я думал, что сохранить раздел кода заблокированным).

В программе есть только один экземпляр объекта, который используется для блокировки.

Ваша помощь очень ценится.

1 Ответ

0 голосов
/ 10 сентября 2010

Лично я не использую функциональность синхронизации в VB.NET, так как считаю, что она привередлива. Мне нравится создавать область видимости логическое выражение:

dim lock as boolean = false

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

 Sub LockUntilShowDialogOkSelected()
    If Not lock Then
      lock = True
      Dim frmDlgWithTimeout As SaveFileDialog ' dialog box with overridden ShowDialog '

      If frmDlgWithTimeout.ShowDialog = Windows.Forms.DialogResult.OK Then
        lock = False
      End If
    End If
  End Sub
...