2010-05-08 15 views
5

Tratando de seguir la hints laid out here, pero ella no menciona cómo manejar la situación cuando su recogida tiene que devolver un valor, así:¿Devolviendo objetos de otro hilo?

private delegate TValue DequeueDelegate(); 
    public virtual TValue Dequeue() 
    { 
     if (dispatcher.CheckAccess()) 
     { 
      --count; 
      var pair = dict.First(); 
      var queue = pair.Value; 
      var val = queue.Dequeue(); 
      if (queue.Count == 0) dict.Remove(pair.Key); 
      OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, val)); 
      return val; 
     } 
     else 
     { 
      dispatcher.BeginInvoke(new DequeueDelegate(Dequeue)); 
     } 
    } 

Esto, obviamente, no va a funcionar, porque dispatcher.BeginInvoke no vuelve cualquier cosa. ¿Que se supone que haga?

+0

Esa publicación de blog tiene 4 años y todavía no la han reparado :( – mpen

+0

+1 Me gustaría ver las respuestas a esta pregunta porque tengo que hacer algo similar en un proyecto propio. –

Respuesta

2

Llame Invoke en lugar de BeginInvoke. Esto lo ejecutará en el hilo del despachador, pero se ejecutará de forma síncrona y devolverá el resultado devuelto por el delegado.

Si no necesita el resultado inmediatamente, agárrese al DispatcherOperation devuelto por BeginInvoke. Cuando necesite el resultado, llame al método Wait de la operación y, si devuelve DispatcherOperationStatus.Completed, lea la propiedad Result.

+0

Oh ... no me di cuenta que 'Invoke' me devolvería el resultado :) – mpen

+0

Sí ... funciona lo suficientemente bien para mis necesidades. – mpen

Cuestiones relacionadas