2012-01-24 9 views
5

Usando TPL con .NET 4, estoy tratando de decidir cómo diseñar API que se ocupen de los futuros. Una posibilidad que se me ocurrió fue para imitar el patrón asincrónico pero sin un método End(IAsyncResult):¿Existe este idioma TPL?

public Task<int> BeginGetAge() 
{ 
    // create and return task 
} 

public int GetAge() 
{ 
    return this.BeginGetAge().Result; 
} 

Como tal, las personas que llaman pueden decidir si se debe llamar el bloqueo o sin bloqueo versión de GetAge(). Además, tienen acceso al futuro, por lo que pueden construir continuaciones encima, etcétera.

¿Es este idioma válido? ¿Hay algún inconveniente o problema obvio que me falta? ¿Tal vez incluso tenga un nombre oficial?

+0

Su segundo caso se beneficiaría enormemente de 'aguardar', creo. – user7116

+0

FYI, Stephen Toub ha publicado sobre esto (ofreciendo envoltorios de sincronización para métodos asíncronos) - tl; dr avoid it :) ver http://blogs.msdn.com/b/pfxteam/archive/2012/04/13/10293638. aspx y también http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx –

Respuesta

3

Volviendo a Task es la nueva forma asíncrona C# 5 - se llama TAP: Task-based Asynchronous Pattern.

La única diferencia es que el método se llama GetAgeAsync.

Por lo tanto, sí, se recomienda este enfoque, ya que facilitará el acceso a la asincrónica C# 5 cuando se libere.

+0

Referencia muy útil - gracias. –

2

Esta expresión idiomática parece perfectamente válida para mí y, de hecho, la compatibilidad con la asincronía basada en Task será una gran característica en las próximas versiones de .Net.

Sin embargo, cambiaría su implementación, por lo que el método de bloqueo GetAge no llama al método async y luego lo espera - no es necesaria la tara en (potencialmente) la creación de un nuevo subproceso.

+0

Se podría cambiar la relación entre los métodos y tener 'BeginGetAge()' return 'Tarea .Factory.StartNew (() => GetAge())'. –

+0

@SeanU Precisamente. –

+1

Bueno, no creo que pueda crear un nuevo hilo sino cambiar el contexto a un hilo existente. E incluso entonces, depende del planificador decidir si esto es necesario. Pero entiendo tu punto y la sugerencia de Sean tiene sentido. –

Cuestiones relacionadas