Страницы

Поиск по вопросам

суббота, 4 апреля 2020 г.

Многопоточность в WPF

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

Комментариев нет:

Отправить комментарий