2011-05-30 13 views
11

Me gustaría diseñar una biblioteca de clases y planear utilizar mutli-threading (es decir, BackgroundWorker). Tendré que tener cuidado con el contexto del hilo, desde el cual se realizan las actualizaciones para los campos, si planeo vincularlos a la interfaz gráfica de usuario de la interfaz de usuario que consume la biblioteca. No es una buena idea pasar la referencia del despachador de GUI a la biblioteca, mientras leo. Pero, ¿cómo puedo obtener acceso al despachador de la aplicación que usará la biblioteca? es posible?Obtención del despachador de IU en la biblioteca de clases

I intentado Application.Current.Dispatcher y ha añadido una referencia a WindowBase (como yo no tenía la posibilidad de añadir System.Windows), pero todavía no puede resolver el objeto despachador.

Respuesta

21

Oh, jaja (lo siento, pero esta es una de esas cosas estúpidas), la clase de aplicación se define en PresentationFramework.dll. Debe hacer referencia a eso para poder acceder al despachador a través del Application.Current.Dispatcher.

+2

Estoy de acuerdo en que usar SynchronizationContext es el camino a seguir – aqwert

+1

Diría que esto no cumple con mis requisitos. Aún no veo cómo puedo transferir esta idea a la biblioteca de la clase; tal vez me esté perdiendo algo. – rdoubleui

+1

Perdón por eso, he entendido mal la pregunta. Cambié mi respuesta –

6

Tuve el mismo problema, es decir, no poder resolver Application.Current.Dispatcher y terminé pasando el cliente gui dispatcher a la biblioteca que solo contiene un Dispatcher ref (referencia WindowsBase + usando System.Windows.Threading).
Prefiero esta opción que teniendo mi lib no GUI tenga que llevar una referencia a PresentationFramework.dll (que no parece natural).
supongo que es 6 de uno, media docena de la otra ...

+0

Es la forma en que lo he hecho antes, pero no parece elegante pasar la referencia del asignador por la estructura del objeto. Podría estar equivocado. – rdoubleui

2

Si se asegura (como con los miembros estáticos de una clase) que tiene una referencia útil a la interfaz de usuario Dispatcher, puede hacerlo esto:

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

Uno o dos marcos MVVM que he visto hacen cosas como esta.

Si no desea pasar esta referencia Dispatcher a la biblioteca, los contenedores IoC son una opción. También puede poner esto en Common.dll para clases e interfaces a las que las bibliotecas exe y class necesitan hacer referencia. El exe puede configurar la referencia correcta, y la biblioteca de clases puede llamar al método Run().

+0

Creo que el problema es obtener el despachador de IU/hebra principal en el código de la biblioteca – Ricibob

+0

Problema similar, podría pasar la referencia 'Dispatcher' a la biblioteca de clases y luego usarla en un contexto 'estático' a partir de ahí, si Te estoy haciendo bien? Entonces podría acceder sin pasarlo a los objetos anidados? – rdoubleui

+1

Exactamente, lo mantiene en un lugar al que todo lo demás puede acceder. Mi mención de Common.dll sería si también lo necesita más de una biblioteca, aunque generalmente no hay razón para crear una biblioteca completamente nueva para ella. Solo necesita entrar en el que todo lo demás hace referencia para evitar dependencias circulares. –

Cuestiones relacionadas