|
dispatcher.BeginInvoke ?
|
|||
---|---|---|---|
#18+
Привет. Как можно из отдельного потока изменить текст у лейбла на форме - дождаться пока текст изменится (перерисуется, чтобы пользователь увидел изменение текста), а потом уже выполнять что-то ? Думал подойдет такое решение: Код: c# 1. 2. 3. 4. 5.
Но нет. Надпись не меняется, а длительная операция начинает выполнятся. Подскажите как решить пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2014, 22:56 |
|
dispatcher.BeginInvoke ?
|
|||
---|---|---|---|
#18+
Есть идеи ? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2014, 10:50 |
|
dispatcher.BeginInvoke ?
|
|||
---|---|---|---|
#18+
WPF Падаван, что надо сделать - то? В ходе выполнения задачи в другом потоке на форму что-то передать? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2014, 11:11 |
|
dispatcher.BeginInvoke ?
|
|||
---|---|---|---|
#18+
Да простоту нужно сделать. После нажатия на кнопку будет происходить 15 секундное действо. Хочу просто тупо в лейбл на форме вывести "выполняем операцию, ждите". После чего запустить длительную штуку. Проблема всего лишь в том, что надпись в лейбле не перерисовывается, после того как я меняю Контент. Т.е. выполняется длительнаня операция и только когда она завершается, лейбл и меняется (хотя уже поздно). PS. Я тут подумал, получается работа идет не в отдельном потоке, а в потоке Интерфейса.... Ну и фиг с ним. В Дельфи, для этого, используется Application.ProcessMesages. А вот в WPF не знаю. Думал, мой вариант пройдет. Я удивлен, что не сработало. Почему ? Вроде бы даю команду диспетчеру, жду завершения выполнения... А результата на экране не вижу. Ну тогда подскажите другой вариант может ? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2014, 11:23 |
|
dispatcher.BeginInvoke ?
|
|||
---|---|---|---|
#18+
Знаю, что у уважаемого "Алексей К " есть проект, где сделан отдельный прогресс бар для длительных операций. Но это не нужно сейчас мне. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2014, 11:25 |
|
dispatcher.BeginInvoke ?
|
|||
---|---|---|---|
#18+
WPF ПадаванЗнаю, что у уважаемого "Алексей К " есть проект, где сделан отдельный прогресс бар для длительных операций. Но это не нужно сейчас мне. если Net 4.5 async -await самое простое решение. Если нет, то: //псевдокод Код: c# 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2014, 12:13 |
|
dispatcher.BeginInvoke ?
|
|||
---|---|---|---|
#18+
Вот эта вся сожность, только на замену простого метода Assplication.ProcessMessages ? хм... ВПФ... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2014, 15:37 |
|
dispatcher.BeginInvoke ?
|
|||
---|---|---|---|
#18+
WPF ПадаванВот эта вся сожность, только на замену простого метода Assplication.ProcessMessages ? хм... ВПФ...а в чем сложность? запускать в цикле Doevent это же полное УГ. Можете backgroundworker, если ностальгия мучает. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2014, 15:56 |
|
dispatcher.BeginInvoke ?
|
|||
---|---|---|---|
#18+
netivanWPF ПадаванВот эта вся сожность, только на замену простого метода Assplication.ProcessMessages ? хм... ВПФ...а в чем сложность? запускать в цикле Doevent это же полное УГ. Можете backgroundworker, если ностальгия мучает. А я вот тут неожиданно очень захотел этот ProcessMessages. Попался чужой контрол. graphlight.codeplex.com Сам по себе хороший. Захотел в него ProgressBar воткнуть на время выполнения вычислений. (рисует графы, сложность там в позиционировании элементов). В итоге алгоритмическая часть контрола работает со своей "ViewModel", которая в данный момент непосредственно прицеплена к XAML элементам. То есть алгоритм двигает вершины графа, вершины генерируют свои PropertyChanged вроде Top, Left. И всё это работает в одном потоке. Запихать всё это в отдельный поток не получается - менять значения элементов управления нельзя, недопустимый межпотоковый. Надо было, чтоб алгоритм в время работы менял только с модель, выдавал конечный результат, и только потом отдавал его во все ViewModel: например, просто скопировать весь DrawingGraph(это центральная модель и ViewModel контрола) с его внутренностями, обработать отдельно и вернуть результат в XAML. Но это долго и внимательно надо. В итоге пришлось скостылить так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
То есть перед обработкой в фоне я отключаю для DrawingGraph возможность уведомлять XAML, после обработки включаю обратно, чтоб показывать результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2014, 17:12 |
|
dispatcher.BeginInvoke ?
|
|||
---|---|---|---|
#18+
WPF Падаван, если не используете MVVM то можно так сделать var loadData = new Thread(() => { Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => myForm.lbl.Content = "Ожидайте")); тут длительные вычисления Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => myForm.lbl.Content = "Загрузка завершена")); } }) {IsBackground = true}; loadData.Start(); как-то так ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2014, 11:38 |
|
dispatcher.BeginInvoke ?
|
|||
---|---|---|---|
#18+
Спасибо за помощь. Ок. Будем считать это специфическими особенностями WPF. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2014, 22:17 |
|
dispatcher.BeginInvoke ?
|
|||
---|---|---|---|
#18+
Предлагаю такое решение. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Dispatcher.Invok почему-то не работает. TaskScheduler.FromCurrentSynchronizationContext предназначен скорее для регулирования выполнения всей задачи (таска). Используется в различных продолжениях (continuation) и мало подходит, если нужно в середине асинхронного метода, быстренько, изменить один компонент формы. Хотя, если сделать цепочку, где одна задача будет делать вычисления, а последняя задача-продолжение, будет расчитанные данные разносить на форме, то TaskScheduler.FromCurrentSynchronizationContext будет выглядеть органичней, чем блок кода вызванный через SyncContext.Send/Post. Жду критику. У меня работает, но может это частный случай просто. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2014, 19:59 |
|
|
start [/forum/topic.php?fid=21&fpage=22&tid=1441069]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
64ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
others: | 283ms |
total: | 463ms |
0 / 0 |