Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не моуг разобраться с BeginInvoke, Begin и EndInvoke запуск. делегат 2 раза 
V
    Опции темы
Torgovec
Дата 12.9.2008, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.11.2005

Репутация: нет
Всего: нет



Мне необходимо запускать метод 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 запускает эту же функцию, в итоге в моем случае возвращаемое значение плывет на единицу. Прошу помочь разобраться.
PM MAIL   Вверх
Torgovec
Дата 12.9.2008, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.11.2005

Репутация: нет
Всего: нет



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

            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:13
PM MAIL   Вверх
Torgovec
Дата 12.9.2008, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.11.2005

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) Torgovec - 12.9.2008, 22:41
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0801 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.