framework async c# entity-framework asynchronous sqldependency

c# - SqlDependency con EntityFramework 6(async)



sqldependency c# (1)

No estoy muy familiarizado con SqlDependency, pero lo que sigue a continuación permitirá que CallContext tenga el valor correcto en el momento en que se llama a ToListAsync (cuando se ejecutan varias llamadas). Prueba de concepto aquí, https://dotnetfiddle.net/F8FnFe

async Task<List<Client>> GetData() { using (ClientsContext context = new ClientsContext()) // subclass of DbContext { SqlDependency.Start(context.Database.Connection.ConnectionString); SqlDependency dependency = new SqlDependency(); dependency.OnChange += (sender, e) => { Console.Write(e.ToString()); }; Task<List<Client>> task = Task<Task<List<Client>>>.Factory.StartNew(async () => { System.Runtime.Remoting.Messaging.CallContext.SetData("MS.SqlDependencyCookie", dependency.Id); var list = await context.Clients.Where(c => c.FirstName.Length > 0).ToListAsync(); }).Unwrap(); return await task; } }

Estoy usando las funciones de consulta async EF 6, como

var list = await cx.Clients.Where(c => c.FirstName.Length > 0).ToListAsync();

También quiero iniciar dependencias SQL en estas consultas para poder recibir notificaciones cuando cambien los datos en la base de datos. Puedo hacer esto usando System.Runtime.Remoting.Messaging.CallContext siguiente manera:

async Task GetData() { using (ClientsContext context = new ClientsContext()) // subclass of DbContext { SqlDependency.Start(context.Database.Connection.ConnectionString); SqlDependency dependency = new SqlDependency(); dependency.OnChange += (sender, e) => { Console.Write(e.ToString()); }; System.Runtime.Remoting.Messaging.CallContext.SetData("MS.SqlDependencyCookie", dependency.Id); var list = await context.Clients.Where(c => c.FirstName.Length > 0).ToListAsync(); } }

.. y funciona bien. Pero me encuentro con un problema si quiero tener una SqlDependency en más de una consulta. Si tengo dos métodos async similares a GetData() anteriores, y ejecuto ambos al mismo tiempo, solo el primero recibirá las notificaciones de cambio. Supongo que esto se debe a que CallContext tiene la cookie establecida por cada método en sucesión. Si espero a que se complete el primer método async , llame al segundo, ambos reciben las notificaciones de cambio como se esperaba. Hay alguna solución para esto?