powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / BackgroundWorker
41 сообщений из 41, показаны все 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
BackgroundWorker
    #38054635
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defragmentator,

почему не поможет - то ?
...
Рейтинг: 0 / 0
BackgroundWorker
    #38054781
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan,

потому что поток должен в этом случае сам себя завершить.
А тут поток сделал запрос к Web-сервису и ждёт ответа (это одна команда, если кто-то не в курсе).
А ответа может и не быть...
...
Рейтинг: 0 / 0
BackgroundWorker
    #38054873
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defragmentator,

тогда вам лучше асинхронный веб реквест =) Ну или Task, Thread и тд. Найти ссылку на поток в BW я лично не смог
...
Рейтинг: 0 / 0
BackgroundWorker
    #38054881
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan,

ссылка получается таким образом:
Код: c#
1.
LoadThread = Thread.CurrentThread;



в методе DoWork для фонового потока
...
Рейтинг: 0 / 0
BackgroundWorker
    #38054888
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defragmentator,

и в самом деле). Тогда в чем проблема? Thread.Abort и ловите исключение)
...
Рейтинг: 0 / 0
BackgroundWorker
    #38054893
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan, и что ловить?
Зачем мне исключение?

Я ловлю так
Код: c#
1.
2.
3.
4.
5.
6.
7.
while (this.bgrWorker1.IsBusy)
            {
                Thread.Sleep(10);  // пусть немного поспит, но только до того, как фоновый поток возвратится.
                Application.DoEvents();
            }

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


или это неправильно?
...
Рейтинг: 0 / 0
BackgroundWorker
    #38054907
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defragmentator,

в исполняющем методе
Код: c#
1.
2.
3.
4.
5.
 catch (ThreadAbortException e)
            {
                
              .....
            }


почитайте Thread.Abort()
...
Рейтинг: 0 / 0
BackgroundWorker
    #38054939
sld
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sld
Гость
вроде только про BackgroundWorker разговор шёл.
нафига так делать.
...
Рейтинг: 0 / 0
BackgroundWorker
    #38054957
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sld,

ну я согласен.но ТС настаивает на таком решение. В конце концов почему бы нет, но тогда теряется смысл BW
...
Рейтинг: 0 / 0
BackgroundWorker
    #38055024
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Результат отрицательный. То есть прервать поток не удалось.
Только при выходе из программы после того, как были попытки прерывания удалось получить исключение:
"Поток находился в режиме прерывания".
А сам по себе поток так и не прервался.
...
Рейтинг: 0 / 0
BackgroundWorker
    #38055101
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defragmentator,

что-то не то делаете...
...
Рейтинг: 0 / 0
BackgroundWorker
    #38055297
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan,

Попробовал проще, поставил в воркер фонового потока просто бесконечный цикл:
Код: c#
1.
2.
3.
4.
 while (true)
                {
                    j = 0;
                }


Он прерывается без проблем.
Обращение к веб-сервису не прерывается до полного выхода из программы.
...
Рейтинг: 0 / 0
BackgroundWorker
    #38055303
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defragmentator,

ну не верю. Приведите код. Thread.Abort - у пофиг что там выполняется.
...
Рейтинг: 0 / 0
BackgroundWorker
    #38055783
sld
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sld
Гость
а к веб сервису как обращение идёт?
...
Рейтинг: 0 / 0
BackgroundWorker
    #38055844
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, обрезал потестировать обращение к веб-сервису:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        // Работа в фоновом потоке
        private void bgrWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            string _xmlPhoto;
            LoadThread = Thread.CurrentThread;
            try
            {
                _xmlPhoto = www.GetXmlPersonalPhoto(@"e4220125-a48a-11db-841d-0014c240f634", @"e4220125-a48a-11db-841d-0014c240f634");

            }

            catch (ThreadAbortException eX)
            {
                MessageBox.Show("Thread - caught ThreadAbortException - resetting 2.");
                MessageBox.Show("Exception message:" + eX.Message.ToString());
            }

        }



Abort вызываю в основном потоке (см. на предыдущей странице метод button1_Click).
...
Рейтинг: 0 / 0
BackgroundWorker
    #38055850
Фотография defragmentator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
www определяю при инициализации формы

Код: c#
1.
2.
3.
4.
5.
        private static ServiceReference1.WSEmployeeInfoPortTypeClient www;

            ....

        www = new ServiceReference1.WSEmployeeInfoPortTypeClient(endpointConfigurationName);
...
Рейтинг: 0 / 0
41 сообщений из 41, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / BackgroundWorker
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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