#c_sharp #wpf
Есть следующий код public class MyWindow: Window { private delegate void SomeDelegate(); private void SomeMethod() { SomeControl.DoAnything(); } private void SomeMethodAsync() { var d = new SomeDelegate(SomeMethod); d.BeginInvoke(null, null); } } Само собой я не могу получить доступ к контролу из другого потока. Поэтому SomeControl.DoAnything(); нужно обернуть в Dispatcher.BeginInvoke(new ThreadStart(delegate { SomeControl.DoAnything(); })); Но это избыточно, если я вызываю SomeMethod() напрямую. Как в этом случае лучше поступить?
Ответы
Ответ 1
Самое простое, это сделать так: if(Application.Current.Dispatcher.CheckAccess()) SomeControl.DoAnything(); else Application.Current.Dispatcher.BeginInvoke(() => SomeControl.DoAnything();); Но это решение невозможно тестировать в юнит тестах, поэтому, лучшим решением будет запоминание UI Dispatcher во ViewModel, и дальнейшее использование этого запомненного аргумента, вместо глобального обращения к Application. Если используете какой-нибудь MVVM фреймворк, там наверняка эта функциональность есть из коробки.
Комментариев нет:
Отправить комментарий