Приветствую всех! Насколько мне известно, wpf использует два потока:один для пользовательского интерфейса, а другой для обработки событий. И если я правильно понимаю, вызвать метод BeginAnimation() можно только с использованием диспетчера, и я пытаюсь поступать так, но ничего не выходит.(кроме надписи о том, что выполняемый поток не может получить доступ к объекту). Возможно , стоит использовать BeginInvoke(), но я не совсем понимаю, для чего нужен второй аргумент. Пожалуйста, помогите разобраться с моей проблемой!
-
1WPF использует один поток для своих дел - хоть в обработчиках, хоть где. BeginInvoke вам понадобится только если вы сами своим кодом явно или неявно создали дополнительный поток – tym32167 Mar 11 '18 at 16:08
-
Ух. Учитывая мои способности к написанию хорошего кода, я более чем уверен, что где-то с потоками я точно накосячил, хотя сложно сказать где. Спасибо! – reinhart Mar 11 '18 at 18:43
1 Answers
Смотрите.
Для отрисовки и своих внутренних дел WPF использует побочные потоки. Но эти потоки для вас невидимы: ваше общение с WPF всё должно происходить в одном-единственном UI-потоке.
Вы можете вызвать метод BeginAnimation, если находитесь в UI-потоке; в противном случае вам нужно из фонового потока отправить кусок вашего кода на выполнение в UI-поток.
Этим всем занимается Dispatcher. Если у вас есть экземпляр Dispatcher'а UI-потока (его можно получить у окна или у объекта Application.Current в обычном случае), вы можете узнать, находитесь ли вы в UI-потоке при помощи dispatcher.CheckAccess(). Отправить кусок кода (например, вызов BeginAnimation или что-то большее) в UI-поток можно, например, при помощи dispatcher.InvokeAsync(() => { тут ваш код }).
(К значению, возвращённому из dispatcher.InvokeAsync, можно применить await, чтобы дождаться окончания выполнения.)
- 206,799
-
Здравствуй! Спасибо за предоставленную информацию!Очень странно, что моя программа себя так ведёт, ибо работаю я всего с одним потоком и дополнительных не использую, или я чего-то не понимаю, пойду искать дополнительную информацию в интернете, дабы не засорять стэк) – reinhart Mar 12 '18 at 11:34
-