|
BackgroundWorker
|
|||
---|---|---|---|
#18+
Добрый день. Пытаюсь работать с BackgroundWorker. В общем, всё получается, только обламывается передача состояния процесса через объект. При инициализации главной формы () делаю так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Вызываю фоновый процесс так: Код: c# 1.
Вот заголовок функции, выполняющей работу процесса: Код: c# 1.
Вот заголовок функции, выполняющейся при завершении процесса: Код: c# 1.
Путаница с объектом e. Во всех функциях он разных типов. Однако, в примере в документации через e.Result из DoWork передаётся результат в RunWorkerCompleted. Аналогично передаётся e.Error. Я же не могу ничего передать, потому что e.Error отсутствует в объекте DoWorkEventArgs, а e.Result имеет тип object для e RunWorkerCompletedEventArgs. Как работать с объектом e? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2012, 11:06 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2012, 11:32 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
Хочу ещё довинтить заставку, которая бы возникала на время ожидания работы фонового процесса. Есть подходящий gif-файл, прикрутил его, всё нормально работает. Есть одно "но". Если фоновый процесс занимает очень короткое время, то появление заставки отвлекает, заставляет напрягаться, когда что-то там мелькает. Хотелось бы сделать так: если основной процесс ждёт 0.5 с, и если фоновый процесс не завершился, то ставится картинка ожидания. Проблема в том, как прервать ожидание 0.5 сек основного процесса, если фоновый завершится раньше? Можно, конечно циклиться по 1 мс и проверять статус фонового процесса, однако, может есть более изящное решение? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2012, 09:54 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
defragmentator, лучше усыпите фоновый поток секунд на пять, заставка будет всегда, так имхо будет красивее ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2012, 09:57 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
Я делаю Thread.Sleep(100); Обычно за это время запрос к БД в фоновом потоке успевает выполниться. А потом включаю заставку. Однако "всегда" - это это не к месту. Смотрите сами. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2012, 10:02 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
defragmentator, я от такой заставки, расхуя..л бы монитор нафиг, вам что вебаяксы спокойно спать мешаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2012, 10:09 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
ведь заставка нужна для юзера, что бы он не паниковал типа где мое приложение, посмотрите как сделана заставка в netbeans ( имхо это самое лучшее что сделано в этой программе) или студии 12 открывается окно и идет бар подгрузки ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2012, 10:16 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
Где-то в степиведь заставка нужна для юзера, что бы он не паниковал типа где мое приложение, посмотрите как сделана заставка в netbeans ( имхо это самое лучшее что сделано в этой программе) или студии 12 открывается окно и идет бар подгрузки Я пишу на C#. А бар подгрузки здесь бесполезняк, поскольку фоновый процесс выполняется одним махом, а не по шагам. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2012, 10:26 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
Если можно было бы обратиться из фонового потока к основному в методе завершения Код: c# 1.
то, возможно, проблема была бы решена (запустить приостановленный основной поток). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2012, 10:31 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
defragmentator фоновый процесс выполняется одним махом, а не по шагам. тогда зачем вам заставка, если одним махом, открывайте форму и грузите данные.. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2012, 10:39 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
Где-то в степиdefragmentator фоновый процесс выполняется одним махом, а не по шагам. тогда зачем вам заставка, если одним махом, открывайте форму и грузите данные.. Загрузка может длиться 0.5 сек, а может и 2 минуты. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2012, 10:49 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
defragmentator, две минуты - однозначно на помойку, До свидания... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2012, 10:53 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
Где-то в степи, это значит, слышал звон, да не знаешь, где он. Смотря чего ждать:) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2012, 11:17 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
Странно, но свойство Код: c# 1.
всегда = True, даже после завершения. С чем это может быть связано? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2012, 12:12 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
defragmentatorСтранно, но свойство Код: c# 1.
всегда = True, даже после завершения. С чем это может быть связано? После запуска воркера, bgrWorker1.IsBusy становится равен faulse, когда Вы попадаете в метод bgrWorker1_RunWorkerCompleted (т.е. когда фоновый процесс завершается). В чем вопрос-то вообще? Делаете в основном потоке Thread.Sleep(500). Далее 2 строчки Код: c# 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2012, 15:07 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
А проблема в том, что главный процесс с формой у меня "спит", ждёт, пока отработает фоновый процесс. А он, в свою очередь, как я понимаю, хочет также вывести по завершении что-то на форму. Теперь понял. Надо разрешить коллизию. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2012, 15:27 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
defragmentatorА проблема в том, что главный процесс с формой у меня "спит", ждёт, пока отработает фоновый процесс. А он, в свою очередь, как я понимаю, хочет также вывести по завершении что-то на форму. Теперь понял. Надо разрешить коллизию. Мне кажется Вы не поняли суть. Зачем главному процессу ждать? событие bgrWorker1_RunWorkerCompleted оповещает, что фоновый процесс(поток) закончен - в нем вызывайте нужный код главного процесса(вынесенный в отдельный метод). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2012, 17:50 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
Дело в том, что ждёт он асинхронно ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2012, 14:06 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
Процессы работают асинхронно, иначе зачем с ними работать вообще? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2012, 14:07 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
defragmentatorДело в том, что ждёт он асинхронно Он это кто, что в предложенном мною методе не асинхронно либо не работает? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2012, 18:03 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
blestdefragmentatorДело в том, что ждёт он асинхронно Он это кто, что в предложенном мною методе не асинхронно либо не работает? Смотрите этот пункт: defragmentatorЯ делаю Thread.Sleep(100); Обычно за это время запрос к БД в фоновом потоке успевает выполниться. А потом включаю заставку. Однако "всегда" - это это не к месту. Смотрите сами. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2012, 18:16 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
Теперь хочу попробовать досрочно завершить запущенный поток. Запускаю в приложении поток, который коннектится к веб-сервису. Если надоедает ждать, можно нажать на кнопку "Выход" в главной форме. Тогда закрывается всё приложение вместе с запущенным потоком. Но хочется просто закрыть поток. Пробую сделать кнопку Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Поток не закрывается и не заканчивается нормальным образом. Или я не могу это обнаружить. Однако приложение по кнопке "выход" по прежнему можно закрыть. Как убить поток? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2012, 10:30 |
|
BackgroundWorker
|
|||
---|---|---|---|
#18+
Метод CancelAsync отправляет на прерывание отложенной фоновой операции и устанавливает свойство CancellationPending равным true. При вызове метода CancelAsync у рабочего метода есть возможность остановить свое выполнение и завершить работу. Работающий код должен периодически проверять свойство CancellationPending, чтобы обнаружить, не установлено ли его значение равным true. а Код: c# 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2012, 11:24 |
|
|
start [/forum/topic.php?fid=20&msg=38049956&tid=1405576]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 322ms |
total: | 465ms |
0 / 0 |