0

Приветствую всех! Насколько мне известно, wpf использует два потока:один для пользовательского интерфейса, а другой для обработки событий. И если я правильно понимаю, вызвать метод BeginAnimation() можно только с использованием диспетчера, и я пытаюсь поступать так, но ничего не выходит.(кроме надписи о том, что выполняемый поток не может получить доступ к объекту). Возможно , стоит использовать BeginInvoke(), но я не совсем понимаю, для чего нужен второй аргумент. Пожалуйста, помогите разобраться с моей проблемой!

  • 1
    WPF использует один поток для своих дел - хоть в обработчиках, хоть где. BeginInvoke вам понадобится только если вы сами своим кодом явно или неявно создали дополнительный поток – tym32167 Mar 11 '18 at 16:08
  • Ух. Учитывая мои способности к написанию хорошего кода, я более чем уверен, что где-то с потоками я точно накосячил, хотя сложно сказать где. Спасибо! – reinhart Mar 11 '18 at 18:43

1 Answers1

1

Смотрите.

Для отрисовки и своих внутренних дел WPF использует побочные потоки. Но эти потоки для вас невидимы: ваше общение с WPF всё должно происходить в одном-единственном UI-потоке.

Вы можете вызвать метод BeginAnimation, если находитесь в UI-потоке; в противном случае вам нужно из фонового потока отправить кусок вашего кода на выполнение в UI-поток.

Этим всем занимается Dispatcher. Если у вас есть экземпляр Dispatcher'а UI-потока (его можно получить у окна или у объекта Application.Current в обычном случае), вы можете узнать, находитесь ли вы в UI-потоке при помощи dispatcher.CheckAccess(). Отправить кусок кода (например, вызов BeginAnimation или что-то большее) в UI-поток можно, например, при помощи dispatcher.InvokeAsync(() => { тут ваш код }).

(К значению, возвращённому из dispatcher.InvokeAsync, можно применить await, чтобы дождаться окончания выполнения.)

VladD
  • 206,799
  • Здравствуй! Спасибо за предоставленную информацию!Очень странно, что моя программа себя так ведёт, ибо работаю я всего с одним потоком и дополнительных не использую, или я чего-то не понимаю, пойду искать дополнительную информацию в интернете, дабы не засорять стэк) – reinhart Mar 12 '18 at 11:34
  • @reinhart: Пожалуйста! Надеюсь, что помогло! – VladD Mar 12 '18 at 14:45