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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> BeginInvoke: как сразу указать, что делать? 
:(
    Опции темы
Dims
Дата 22.10.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

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



В джаве я мог писать:

Код

SwingUtilities.InvokeLater( new Runnable() {
   public void run() {
   ...
   }
});


Как мне так же написать в C#?

А то у меня как-то уж совсем нелепо получается: сперва определяю специальный тип делегата, 

Код

public delegate void Kick();


затем определяю метод с той же сигнатурой 

Код

private void RefreshList()
        {...


и только потом вызваю BeginInvoke

Код

BeginInvoke(new Kick(RefreshList));


Сразу две лишние сущности!
PM MAIL   Вверх
PashaPash
Дата 22.10.2008, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

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



Dims
Код

ThreadPool.QueueUserWorkItem(new WaitCallback(Kick));
или если не хочешь менять сигнатуру:
ThreadPool.QueueUserWorkItem(delegate { ... } );
ThreadPool.QueueUserWorkItem(delegate { Kick(); } );



--------------------
PM MAIL WWW   Вверх
yar
Дата 22.10.2008, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 8.9.2007
Где: Одесса, Украина

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



C# 3.0:
Код
BeginInvoke(new MethodInvoker( 
        () => {
            MessageBox.Show("dada");
        }
));


C# 2.0:
Код
BeginInvoke(new MethodInvoker( 
        delegate() {
            MessageBox.Show("dada");
        }
));

--------------------
Если бы строители возводили здания так, как программисты пишут программы, первый же дятел уничтожил бы мировую цивилизацию.Джеральд Вайнберг
PM MAIL WWW   Вверх
Dims
Дата 25.10.2008, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

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



А зачем нужен этод MethodInvoker?

Почему сразу нельзя написать:

BeginInvoke(RefreshList);

В Си++, помнится, если какой-то метод принимал указатель на функцию, ему можно было передать прямо имя этой функции (может, с амперсандом, не помню).


PM MAIL   Вверх
PashaPash
Дата 25.10.2008, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

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



Dims, BeginInvoke принимает объект типа Delegate, а не указатель. Delegate - абстрактный класс. Автовывода типов делегатов (типа того, что есть для классов и методов) пока нет. Вот и приходится любой неабстрактный тип-наследник Delegate.


--------------------
PM MAIL WWW   Вверх
Dims
Дата 30.10.2008, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

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



А вот так будет правильно работать:

Код

for( int i = 0; i<10; ++i ) {
BeginInvoke(new MethodInvoker( 
        delegate() {
            MessageBox.Show(i);
        }
));
}


Мне кажется, что получается так, что ко времени выполнения MessageBox цикл успевает уже пройти несколько итераций и в MessageBox может попасть не первое значение. Это так?

Добавлено через 1 минуту и 44 секунды
Иными словами, если в делегат попадает функция, которая использует значения некоторых переменных, то сохраняются ли эти значения до времени выполнения делегата?
PM MAIL   Вверх
yar
Дата 30.10.2008, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 8.9.2007
Где: Одесса, Украина

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



Dims, Верно. будет использовано то значение, которое существует на момент вызова делегата.
Скорее всего к тому моменту, как начнёт выполнятся MessageBox.Show, цикл уже закончится, и все сообщения будут десятками.

Java нас ограничивает, заставляя объявлять все переменные, на которые замыкается анонимный класс как final, так что если мы напишем что-то вроде следующего, при наличии MyBeginInvoke:

Код
for(int i=0;i <5; i++) {
    MyBeginInvoke( new Runnable() {
        @Override
        public void run() {
            System.out.println(i);    
        }    
    });;
}


То на нас ругнутся, что i должно быть final

Если же в java7 добавят замыкания, то тут наступит такой же беспредел, как и в С# ;).
--------------------
Если бы строители возводили здания так, как программисты пишут программы, первый же дятел уничтожил бы мировую цивилизацию.Джеральд Вайнберг
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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