2012-09-19 16 views

Respuesta

6

EF 5 no tiene soporte async/await, pero la versión de código abierto está buscando activamente posibilidades aquí. EDITAR: el soporte de Async en EF está documentado en http://msdn.microsoft.com/en-us/data/jj819165.aspx. No transmite los resultados porque están hidratados (como encontraría con RX) pero hace que las llamadas a la base de datos sean asincrónicas.

En cuanto a LINQ to SQL, aparte de completar su solicitud en una operación Task.Factory.Start, no contaría con la esperanza de que esa tarea basada en async (requerida para async/await) sea implementada por Microsoft para Linq a SQL.

Puede usar el IQToolkit y ampliarlo agregando su propio soporte asíncrono si es absolutamente necesario. Además, Mono ha implementado LINQ to SQL, que es posible que pueda ampliar con soporte asíncrono.

3

Scott Hanselman tiene interesting post donde demuestra cómo se podría producir una API asincrónica sobre una consulta existente de Linq a SQL. No tengo demasiado tiempo para jugar con la idea, pero supongo que se podría crear un método de extensión más genérico que permita expandir la misma técnica a cualquier objeto de tipo IQueryable o IEnumerable.

Aquí está el código directamente de su publicación para usar como referencia.

SqlCommand _beginFindCmd = null; 

public IAsyncResult BeginFind(int id, AsyncCallback callback, Object asyncState) 
{ 
    var query = from w in _db.Widgets 
       where w.Id == id 
       select w; 
    _beginFindCmd = _db.GetCommand(query) as SqlCommand; 
    _db.Connection.Open(); 
    return _beginFindCmd.BeginExecuteReader(callback, asyncState, System.Data.CommandBehavior.CloseConnection); 
} 

public Widget EndFind(IAsyncResult result) 
{ 
    var rdr = _beginFindCmd.EndExecuteReader(result); 
    var widget = (from w in _db.Translate<Widget>(rdr) 
        select w).SingleOrDefault(); 
    rdr.Close(); 
    return widget; 
} 

Con un poco de trabajo se podría hacer este TPL y, de manera similar, incluso más limpio como un único método asíncrono. Si tengo la oportunidad de hacer esto, publicaré lo que se me ocurra.