Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Не моуг разобраться с BeginInvoke


Автор: Torgovec 12.9.2008, 21:27
Мне необходимо запускать метод CheckConnection класса Pinger ,и ловить из него значение, но при этом программа не должна ожидать окончания работы этого метода т.к. внутри него используется рекурсия, т.е. без использования треда метод вешает всю программу.
Вот чем я попытался выйти из положения:

Код

delegate int CheckConn(); //Делегат создан для запуска треда Pinger.CheckConnection, который возвращает int
...
int nResult = 0; // Сюда буду сохранять значение из Pinger.CheckConnection
...
private void timer1_Tick(object sender, EventArgs e)
{
            CheckConn cc = new CheckConn(Pinger.CheckConnection); // Создаем экземпляр делегата
            IAsyncResult res = cc.BeginInvoke(null,Pinger.CheckConnection()); // Вызываем через делегат метод
            nResult = cc.EndInvoke(res); // Ловим return value, через переменную res.
}


Сразу оговорюсь, что код приведенный выше я подсмотрел в гугле, когда искал способ возвращать значения из треда.
Я представлял себе, что это должно работать примерно так:
Сохраняем в делегате ссылку на функцию, BeginInvoke запускает Threadс этой функцией, а EndInvoke проверяет, если Thread отработал и вернул значение сохраняет его в nResult . На деле выходит следующее:
BeginInvoke запускает функцию, а сразу после него EndInvoke запускает эту же функцию, в итоге в моем случае возвращаемое значение плывет на единицу. Прошу помочь разобраться.

Автор: Torgovec 12.9.2008, 22:13
Вроде немного разобрался, заменил на след. конструкцию:
Код

            CheckConn cc = new CheckConn(Pinger.CheckConnection); // Создаем экземпляп делегата
            IAsyncResult res = cc.BeginInvoke(null,null); // Вызываем через делегат метод
            nResult = cc.EndInvoke(res); // Ловим return value, через переменную res.


Теперь функция возвращает правильно значение, только заметил следующую вещь - независимо от того что создается поток, программа притормаживает на этом месте,т.е. когда запускается cc.BeginInvoke(null,null), форма приложения на любые события не реагирует, до EndInvoke :(

Автор: Torgovec 12.9.2008, 22:40
Спасибо, я во всем разобрался smile совершенно не правильно понимал как работает код приведенный мной.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)