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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фоновие потоки. Обратный вызов. Кросспотоковие оп. How to? 
V
    Опции темы
lam0x7C4
Дата 18.10.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 1.6.2007
Где: Киев

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



Всем привет.
О, великие гуру .НЕТа, подскажите пожалуйста, что делать, если:

...есть у нас форма, которая ссылаеться на класс, который виполняет некоторый код в фоновом потоке( например, жмем на кнопку, и в фоне перемножаються матрицы, или еще че-то тяжелое, или Thread.Sleep(5000) smile). 
И когда в фоновом потоке вичисления завершаються мы выдаем результат на форму обратным вызовом некоторого метода ShowResult(SomeResultClass someResult)). Но чтоб не випригнул ексепшн о кросспотоковых операция, надо прописывать Invoke. И вроде все работает. Но как сделать, чтоб не пришлось использовать етот Инвоке, ибо не нравитсо мне етот метод.
(т.е. как заставить виполняться  метод ShowResult в основном потоке.)?
PM MAIL ICQ   Вверх
HalkaR
Дата 18.10.2007, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



Цитата(lam0x7C4 @ 18.10.2007,  19:12)
(т.е. как заставить виполняться  метод ShowResult в основном потоке.)?

Использовать Invoke  smile 
FА ообще кури класс BackgroundWorker - он автоматизирует этот процесс.
PM MAIL   Вверх
lam0x7C4
Дата 18.10.2007, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 1.6.2007
Где: Киев

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



BackgourndWorker не юзаю, т.к. мне надо, чтоб была возможность отменять операцию, которая виполняеться в фоне.
BackgourndWorker  делает ето очень фигово, если он вообще пытаеться ето сделать, когда его просят.

Лучше сначала опишу все подробнее.
Xочу написать класс ( Мой_Класс ), который виполняет некоторый код в фоновом потоке.
  У класса Мой_класс есть делегат Делегат_обратного_вызова, значение которому присваивает клиент.
  При завершении виполнения должен запуститься метод, на который указывает делегат.
Тоесть все должно выглядть где-то так:

Код

public class Мой_Класс
{
    public delegate void Делегат_обратного_вызова(string);
    public  Делегат_обратного_вызова Дел

     public Метод_фон_потока(Делегат_обратного_вызова  дел)
    {
        Дел = дел;
           //
          // Каким-то макаром запускаем Тяжелый_метод() в фоновом потоке
          // (Через ThreadStart() или BeginInvoke или ThreadPool)
          // 
          if(Дел != null)
         {
              // Чтоб следующая строчка нормально виполнилась в ВинФормз, клиенту надо писать Invoke
              // что не есть хорошо, т.к. клиент должен абстрагироваться от всяких так Инвоков 
              // Всякая такая муть должна быть в пределах етого класса
              Дел("Ура!! досчитали до  " + int.MaxValue.ToString());   
              // Как же запустить ето в основном потоке  ? :(        
          }
     }
     private void  Тяжелый_метод()
     {
         for(int i = 0; i < int.MaxValue; i++)
         ;
     }
   
}

Думаю, идея понятна: всякие там Инвоки, делегаты(кроме Делегат_обратного_вызова) не хочу  юзать, потому что они  должны волновать не клиента, а меня. Вот. 
п.с. Извините за такой безобразно-гибридный код... Спешил очень )

Это сообщение отредактировал(а) lam0x7C4 - 19.10.2007, 01:04
PM MAIL ICQ   Вверх
LuMee
Дата 19.10.2007, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Первая мысль, пришедшая в голову. Вместо того, чтобы создавать объект Мой_Класс из формы, нужно завести некий класс-медиатор, который будет содержать ссылки на форму и на объект Мой_Класс. При создании медиатора ты указываешь ему форму, с которой он должен работать, и делегат Делегат_обратного_вызова, который надо вызвать. Медиатор, в свою очередь, создает у себя объект Мой_Класс, назначая ему в качестве делегата обратного вызова некий свой метод. Этот метод уже и вызывает делегат на форме с помощью Invoke.
PM MAIL   Вверх
lam0x7C4
Дата 19.10.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 1.6.2007
Где: Киев

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



Спасибо.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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