次のようなEF 6async
クエリ機能を使用しています
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
しかし、複数のクエリを実行したい場合、問題が発生しています。上記のような2 つのasync
メソッドがGetData()
あり、両方を同時に実行すると、最初のメソッドだけが変更通知を受け取ります。これは、CallContext が各メソッドによって設定された Cookie を連続して保持しているためであると想定しています。最初のメソッドが完了するのを待ってからasync
2 番目のメソッドを呼び出すと、両方とも期待どおりに変更通知を受け取ります。これに対する解決策はありますか?