Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与EntityFramework 6的SqlDependency(异步)_C#_Entity Framework_Asynchronous_Sqldependency - Fatal编程技术网

C# 与EntityFramework 6的SqlDependency(异步)

C# 与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

我正在使用EF6
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;
        }
    }