C# 与EntityFramework 6的SqlDependency(异步)
我正在使用EF6C# 与EntityFramework 6的SqlDependency(异步),c#,entity-framework,asynchronous,sqldependency,C#,Entity Framework,Asynchronous,Sqldependency,我正在使用EF6async查询功能,例如 var list = await cx.Clients.Where(c => c.FirstName.Length > 0).ToListAsync(); 我还希望对这些查询启动SQL依赖关系,以便在数据库中的数据发生更改时收到通知。我可以使用System.Runtime.Remoting.Messaging.CallContext如下所示: async Task GetData() { using (Cli
async
查询功能,例如
var list = await cx.Clients.Where(c => c.FirstName.Length > 0).ToListAsync();
我还希望对这些查询启动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();
}
}
。。而且效果很好。但是如果我想在多个查询上使用
SqlDependency
,我就会遇到一个问题。如果我有两个类似于上面的GetData()
的async
方法,并且我同时运行这两个方法,那么只有第一个方法会收到更改通知。我假设这是由于CallContext连续地由每个方法设置cookie造成的。如果我等待第一个async
方法完成,然后调用第二个,它们都会收到预期的更改通知。有什么解决方案吗?我不太熟悉SqlDependency,但下面的内容将允许您的CallContext在调用ToListSync时(当多个调用正在运行时)具有正确的值。这里的概念证明
异步任务GetData()
{
使用(ClientsContext context=new ClientsContext())//DbContext的子类
{
SqlDependency.Start(context.Database.Connection.ConnectionString);
SqlDependency=新的SqlDependency();
dependency.OnChange+=(发送方,e)=>
{
Console.Write(例如ToString());
};
Task Task=Task.Factory.StartNew(异步()=>
{
System.Runtime.Remoting.Messaging.CallContext.SetData(“MS.sqldependencyccookie”,dependency.Id);
var list=await context.Clients.Where(c=>c.FirstName.Length>0.toListSync();
}).Unwrap();
返回等待任务;
}
}
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;
}
}