use*_*657 11 c# asynchronous entity-framework sqldependency
我正在使用EF 6 async查询功能,例如
var list = await cx.Clients.Where(c => c.FirstName.Length > 0).ToListAsync();
Run Code Online (Sandbox Code Playgroud)
我还想在这些查询上启动SQL依赖项,以便在数据库中的数据发生更改时收到通知.我可以使用System.Runtime.Remoting.Messaging.CallContext以下内容执行此操作:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
..它工作正常.但是,如果我想要一个SqlDependency多个查询,我遇到了一个问题.如果我有两个async类似于GetData()上面的方法,并且我同时运行两个方法,则只有第一个方法会获得更改通知.我假设这是由于CallContext连续地为每个方法设置了cookie.如果我等待第一个async方法完成,然后调用第二个方法,它们都会按预期获得更改通知.这有什么解决方案吗?
Ken*_*Ito 10
我不太熟悉SqlDependency,但是下面的内容将允许您的CallContext在调用ToListAsync时具有正确的值(当多个调用正在运行时).这里有概念证明,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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8948 次 |
| 最近记录: |