#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 фреймворк, там наверняка эта функциональность есть из коробки.
Комментариев нет:
Отправить комментарий