解決策を見つけましたが、それがどれほど優れているかは完全にはわかりません。最初に、イベントを「サブスクライブ」するために使用されるWCFメソッドを作成しました
インターフェイス宣言
[OperationContract]
[WebInvoke(Method = "GET",
BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "Notification")]
Stream Notification();
サービスクラスの実装
public Stream Notification()
{
string result= "";
using (FbConnection conn= new FbConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString))
{
conn.Open();
FbRemoteEvent events= new FbRemoteEvent(conn, "event1", "event2", "event3", "event4");
events.QueueEvents();
AutoResetEvent waitHandle = new AutoResetEvent(false);
eventi.RemoteEventCounts += (sender, args) =>
{
if (args.Counts > 0)
{
result= args.Name;
waitHandle.Set();
}
};
waitHandle.WaitOne();
}
return new MemoryStream(Encoding.UTF8.GetBytes(result));
}
post_event が発生するまで AutoResetEvent を使用してサービス インスタンスをフリーズし、それが発生すると AutoResetEvent の Set() メソッドが呼び出されてサービスのフリーズを解除し、私の場合はイベント名を返すので、どのイベントがトリガーされたかがわかります。クライアント側では、別のスレッドでこのメソッドを呼び出し、その応答を待っています。取得したら、それに応じて処理し、同じメソッド要求を再送信して、次の post_event をキャッチできるようにします。
PSこれを機能させるには、InstanceContextModeをPerCallに設定する必要があります。