powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / BackgroundWorker
25 сообщений из 41, страница 1 из 2
BackgroundWorker
    #38048298
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Пытаюсь работать с BackgroundWorker.
В общем, всё получается, только обламывается передача состояния процесса через объект.

При инициализации главной формы () делаю так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
namespace WFormsAppOneSTest1
{
    partial class Form1
    {

        private System.ComponentModel.BackgroundWorker bgrWorker1;

        private void InitializeComponent()
        {
            this.bgrWorker1 = new System.ComponentModel.BackgroundWorker();

            this.bgrWorker1.WorkerReportsProgress = true;
            this.bgrWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgrWorker1_DoWork);
            this.bgrWorker1.RunWorkerCompleted += new 
System.ComponentModel.RunWorkerCompletedEventHandler(this.bgrWorker1_RunWorkerCompleted);
        }
    }
}




Вызываю фоновый процесс так:
Код: c#
1.
this.bgrWorker1.RunWorkerAsync();



Вот заголовок функции, выполняющей работу процесса:
Код: c#
1.
private void bgrWorker1_DoWork(object sender, DoWorkEventArgs e)



Вот заголовок функции, выполняющейся при завершении процесса:
Код: c#
1.
void bgrWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)



Путаница с объектом e. Во всех функциях он разных типов. Однако, в примере в документации через e.Result из DoWork передаётся результат в RunWorkerCompleted.
Аналогично передаётся e.Error.
Я же не могу ничего передать, потому что e.Error отсутствует в объекте DoWorkEventArgs, а
e.Result имеет тип object для e RunWorkerCompletedEventArgs.
Как работать с объектом e?
...
Рейтинг: 0 / 0
BackgroundWorker
    #38048363
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defragmentatorПутаница с объектом e. Во всех функциях он разных типов. Однако, в примере в документации через e.Result из DoWork передаётся результат в RunWorkerCompleted.
Все просто. Значение присвоенное DoWorkEventArgs.Result будет скопировано в в RunWorkerCompletedEventArgs.Result.

defragmentatore.Result имеет тип object для e RunWorkerCompletedEventArgs.
Все классы в .NET наследуются от object. Следовательно поле Result может хранить экземпляры любых типов. Ты должен привести его значение к нужному тебе типу и работать далее с ним.

defragmentatorАналогично передаётся e.Error.
Неверно. В Error записывается исключение которое было возбуждено при исполнении обработчика DoWork. Если исключений не будет, то Error будет равен null.
...
Рейтинг: 0 / 0
BackgroundWorker
    #38048467
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, спасибо
...
Рейтинг: 0 / 0
BackgroundWorker
    #38049956
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу ещё довинтить заставку, которая бы возникала на время ожидания работы фонового процесса.
Есть подходящий gif-файл, прикрутил его, всё нормально работает.
Есть одно "но". Если фоновый процесс занимает очень короткое время, то появление заставки отвлекает, заставляет напрягаться, когда что-то там мелькает.
Хотелось бы сделать так: если основной процесс ждёт 0.5 с, и если фоновый процесс не завершился, то ставится картинка ожидания.
Проблема в том, как прервать ожидание 0.5 сек основного процесса, если фоновый завершится раньше?
Можно, конечно циклиться по 1 мс и проверять статус фонового процесса, однако, может есть более изящное решение?
...
Рейтинг: 0 / 0
BackgroundWorker
    #38049961
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defragmentator,
лучше усыпите фоновый поток секунд на пять, заставка будет всегда, так имхо будет красивее
...
Рейтинг: 0 / 0
BackgroundWorker
    #38049970
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я делаю Thread.Sleep(100);
Обычно за это время запрос к БД в фоновом потоке успевает выполниться.
А потом включаю заставку.
Однако "всегда" - это это не к месту.
Смотрите сами.
...
Рейтинг: 0 / 0
BackgroundWorker
    #38049985
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defragmentator,
я от такой заставки, расхуя..л бы монитор нафиг, вам что вебаяксы спокойно спать мешаю?
...
Рейтинг: 0 / 0
BackgroundWorker
    #38049996
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ведь заставка нужна для юзера, что бы он не паниковал типа где мое приложение, посмотрите как сделана
заставка в netbeans ( имхо это самое лучшее что сделано в этой программе) или студии 12 открывается окно и идет бар подгрузки
...
Рейтинг: 0 / 0
BackgroundWorker
    #38050006
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиведь заставка нужна для юзера, что бы он не паниковал типа где мое приложение, посмотрите как сделана
заставка в netbeans ( имхо это самое лучшее что сделано в этой программе) или студии 12 открывается окно и идет бар подгрузки
Я пишу на C#.
А бар подгрузки здесь бесполезняк, поскольку фоновый процесс выполняется одним махом, а не по шагам.
...
Рейтинг: 0 / 0
BackgroundWorker
    #38050020
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если можно было бы обратиться из фонового потока к основному в методе завершения
Код: c#
1.
void bgrWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)


то, возможно, проблема была бы решена (запустить приостановленный основной поток).
...
Рейтинг: 0 / 0
BackgroundWorker
    #38050038
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defragmentator фоновый процесс выполняется одним махом, а не по шагам.
тогда зачем вам заставка, если одним махом, открывайте форму и грузите данные..
...
Рейтинг: 0 / 0
BackgroundWorker
    #38050061
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиdefragmentator фоновый процесс выполняется одним махом, а не по шагам.
тогда зачем вам заставка, если одним махом, открывайте форму и грузите данные..

Загрузка может длиться 0.5 сек, а может и 2 минуты.
...
Рейтинг: 0 / 0
BackgroundWorker
    #38050077
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defragmentator,
две минуты - однозначно на помойку, До свидания...
...
Рейтинг: 0 / 0
BackgroundWorker
    #38050130
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

это значит, слышал звон, да не знаешь, где он.

Смотря чего ждать:)
...
Рейтинг: 0 / 0
BackgroundWorker
    #38050238
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, но свойство
Код: c#
1.
this.bgrWorker1.IsBusy

всегда = True, даже после завершения.
С чем это может быть связано?
...
Рейтинг: 0 / 0
BackgroundWorker
    #38050687
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defragmentatorСтранно, но свойство
Код: c#
1.
this.bgrWorker1.IsBusy

всегда = True, даже после завершения.
С чем это может быть связано?

После запуска воркера, bgrWorker1.IsBusy становится равен faulse, когда Вы попадаете в метод bgrWorker1_RunWorkerCompleted (т.е. когда фоновый процесс завершается).

В чем вопрос-то вообще? Делаете в основном потоке Thread.Sleep(500). Далее 2 строчки
Код: c#
1.
2.
if (bgrWorker1.IsBusy)
    MyGif.Show(this);
...
Рейтинг: 0 / 0
BackgroundWorker
    #38050728
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А проблема в том, что главный процесс с формой у меня "спит", ждёт, пока отработает фоновый процесс. А он, в свою очередь, как я понимаю, хочет также вывести по завершении что-то на форму.
Теперь понял. Надо разрешить коллизию.
...
Рейтинг: 0 / 0
BackgroundWorker
    #38051104
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defragmentatorА проблема в том, что главный процесс с формой у меня "спит", ждёт, пока отработает фоновый процесс. А он, в свою очередь, как я понимаю, хочет также вывести по завершении что-то на форму.
Теперь понял. Надо разрешить коллизию.

Мне кажется Вы не поняли суть. Зачем главному процессу ждать?
событие bgrWorker1_RunWorkerCompleted оповещает, что фоновый процесс(поток) закончен - в нем вызывайте нужный код главного процесса(вынесенный в отдельный метод).
...
Рейтинг: 0 / 0
BackgroundWorker
    #38051625
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том, что ждёт он асинхронно
...
Рейтинг: 0 / 0
BackgroundWorker
    #38051627
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Процессы работают асинхронно, иначе зачем с ними работать вообще?
...
Рейтинг: 0 / 0
BackgroundWorker
    #38053765
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defragmentatorДело в том, что ждёт он асинхронно

Он это кто, что в предложенном мною методе не асинхронно либо не работает?
...
Рейтинг: 0 / 0
BackgroundWorker
    #38053789
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blestdefragmentatorДело в том, что ждёт он асинхронно

Он это кто, что в предложенном мною методе не асинхронно либо не работает?

Смотрите этот пункт:

defragmentatorЯ делаю Thread.Sleep(100);
Обычно за это время запрос к БД в фоновом потоке успевает выполниться.
А потом включаю заставку.
Однако "всегда" - это это не к месту.
Смотрите сами.
...
Рейтинг: 0 / 0
BackgroundWorker
    #38054332
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь хочу попробовать досрочно завершить запущенный поток.
Запускаю в приложении поток, который коннектится к веб-сервису.
Если надоедает ждать, можно нажать на кнопку "Выход" в главной форме.
Тогда закрывается всё приложение вместе с запущенным потоком.

Но хочется просто закрыть поток.
Пробую сделать кнопку

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
        private void button1_Click(object sender, EventArgs e)
        {
            // Cancel the asynchronous operation.
            this.bgrWorker1.CancelAsync();
            LoadThread.Abort();

            while (this.bgrWorker1.IsBusy)
            {
                Thread.Sleep(10);  // пусть немного поспит, но только до того, как фоновый поток возвратится.
                Application.DoEvents();
            }

            MessageBox.Show("Поток закрылся");
        }



Поток не закрывается и не заканчивается нормальным образом. Или я не могу это обнаружить.
Однако приложение по кнопке "выход" по прежнему можно закрыть.

Как убить поток?
...
Рейтинг: 0 / 0
BackgroundWorker
    #38054416
sld
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sld
Гость
Метод CancelAsync отправляет на прерывание отложенной фоновой операции и устанавливает свойство CancellationPending равным true.

При вызове метода CancelAsync у рабочего метода есть возможность остановить свое выполнение и завершить работу. Работающий код должен периодически проверять свойство CancellationPending, чтобы обнаружить, не установлено ли его значение равным true.

а
Код: c#
1.
WorkerSupportsCancellation =true;

?
...
Рейтинг: 0 / 0
BackgroundWorker
    #38054474
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sld, разумеется.
Однако это здесь не поможет (читай док).
Поток нужно именно убить.
...
Рейтинг: 0 / 0
25 сообщений из 41, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / BackgroundWorker
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]