Получение диспетчера пользовательского интерфейса в библиотеке классов

Я хотел бы создать библиотеку классов и планировать использование mutli-threading (т.е. BackgroundWorker). Мне нужно будет следить за контекстом потока, из которого сделаны обновления для полей, если я планирую связать их с графическим интерфейсом библиотеки, использующей интерфейс. Не рекомендуется передавать ссылку диспетчера графического интерфейса в библиотеку, как я читал. Но как я могу получить доступ к диспетчеру приложения, которое будет использовать библиотеку? Возможно ли это?

Я попробовал Application.Current.Dispatcher и добавил ссылку на WindowBase (поскольку у меня не было возможности добавить System.Windows), но до сих пор не удается разрешить объект диспетчера.

Ответ 1

О, ха-ха (извините, но это одна из тех глупых вещей), класс Application определен в PresentationFramework.dll. Вы должны ссылаться на это, чтобы иметь доступ к диспетчеру через Application.Current.Dispatcher.

Ответ 2

У меня была одна и та же проблема, т.е. неспособность разрешить Application.Current.Dispatcher и закончила передачу диспетчера gui клиента в библиотеку, которая просто содержит ссылку Dispatcher ref (ссылка на WindowsBase + с использованием System.Windows.Threading).
Я предпочитаю этот вариант, чтобы иметь мою библиотеку без GUI для переноса ссылки на PresentationFramework.dll(что не кажется естественным). Я думаю, его 6 из одного, полдюжины других...

Ответ 3

Если вы убедитесь (например, со статическими членами класса), что у вас есть удобная ссылка на пользовательский интерфейс Dispatcher, вы можете сделать это:

public static void Run( Action a ) {
    if ( !_uiDispatcher.CheckAccess() ) {
        _uiDispatcher.BeginInvoke( a );
    }
    else {
        a();
    }
}

Один или два фреймворка MVVM, на которые я смотрел, делают такие вещи.

Если вы не хотите передавать эту ссылку Dispatcher в библиотеку, яблоки IoC являются опцией. Вы также можете поместить это в Common.dll для классов и интерфейсов, которые должны использоваться как библиотеками exe, так и классами. Exe может установить правильную ссылку, а библиотека классов может вызвать метод Run().