Лучший отвечающий
Приоритет потока, последовательносить действий

Вопрос
-
Есть процедура 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 -
Выполняйте вызов Test2 синхронно. Т.е. вызывайте вместо Dispatcher.BeginInvoke метод Dispatcher.Invoke
Invoke является синхронной операцией; поэтому управление не возвращается вызывающему объекту до тех пор, пока функция обратного вызова не завершит свою работу.
Для связи [mail]- Помечено в качестве ответа Abolmasov Dmitry 10 августа 2011 г. 13:59
4 августа 2011 г. 9:12
Все ответы
-
Создать в 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