none
Приоритет потока, последовательносить действий RRS feed

  • Вопрос

  • Есть процедура Test01, вызванная из другого потока, в ней вызывается процедура Test02.

     

    Private Sub Test01(ByVal Status As Boolean)
      If Status = False Then
       Dispatcher.BeginInvoke(New Action(Sub() Test02))
      Else
       WaitEvent.[Set]()
      End If
    If Temps = 0....
     End Sub


    Нужно что бы сначала выполнилась процедура Test02, а потом только Test01 завершилась. А в данном случае процедура Test02 еще не закончила выполняться, в то время как Test01 проверяет переменную Temps... Как сделать действия последовательными?

     



    1 августа 2011 г. 14:50

Ответы

Все ответы

  • Создать в Test1 AutoResetEvent, передать его в Test2, в котором по завершению вызвать метод Set объекта AutoResetEvent. В Test1 ожидать сигнала от AutoResetEvent с помощью метода WaitOne.

    Разве не это обсуждали в топике - Функция ожидания?


    Для связи [mail]
    • Предложено в качестве ответа Abolmasov Dmitry 4 августа 2011 г. 9:08
    • Отменено предложение в качестве ответа Abolmasov Dmitry 4 августа 2011 г. 9:08
    • Помечено в качестве ответа Abolmasov Dmitry 10 августа 2011 г. 13:58
    1 августа 2011 г. 16:43
  • Да, но тут без этого надо. С ним почему то программа зависает полностью.
    1 августа 2011 г. 18:02
  • Очень странно и такого не должно быть, больше похоже на ошибку реализации.

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


    Для связи [mail]
    2 августа 2011 г. 5:26
  • Да, только проблема, в Test2 есть строка подключения к SQL  - Rec = Cnn.Execute("SELECT * FROM ....") Обращение невозможно с другого потока.. Если использовать Me.Dispatcher.Invoke(New Action(Sub() )) намертво зависает, если BeginInvoke - выдает ошибку, так как не успевает выполнить запрос и Rec остается пустым...
    2 августа 2011 г. 18:20
  • Выполняйте вызов Test2 синхронно. Т.е. вызывайте вместо Dispatcher.BeginInvoke метод Dispatcher.Invoke

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

    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 10 августа 2011 г. 13:59
    4 августа 2011 г. 9:12
  • Пробовал, чуть вышек писал.

    >>  Если использовать Me.Dispatcher.Invoke(New Action(Sub() )) намертво зависает, если BeginInvoke - выдает ошибку, так как не успевает выполнить запрос и Rec остается пустым...

    4 августа 2011 г. 9:48
  • Ну раз зависает, то значит выпослняется функция переданная в Invoke. Пробуйте искать проблему в ней.


    Для связи [mail]
    4 августа 2011 г. 10:07