0

我是 stackoverflow 的新手,但我每天都使用它。今天我需要你,因为我在任何地方都得不到这些信息。

我的问题是:我想为客户提供回调服务,但我不想回调他们在服务中调用的函数。(类似于订阅者/发布者)我想保存回调实例。然后我想要一个服务在我的服务中调用一个函数,该函数将触发回调(如下所示:callbacks.PrintMessage("Message"));)将回调实例保存在静态类的静态列表中。

调用 callback.function() 时,我收到此错误:“您正在使用 Disposed 对象”,因为我正在使用以下内容获取实例:OperationContext.Current.GetCallbackChannel<"callback interface">

我能做些什么来保存回调实例?

非常感谢。

佩德罗

代码:

//FUNCTION IN MY SERVICE
        public void Subscribe()
                {
                   var callback = OperationContext.Current.GetCallbackChannel<IMonitoringWebServiceCallback>();
                    callbacks.Add(callback);

                    callback = OperationContext.Current.GetCallbackChannel<IMonitoringWebServiceCallback>();


                    AlarmCallbackSingleton.Instance.AddCallback(callback);

                    //callback.PrintString("String"); //HERE IT WORKS! BUT I DONT WANT CALL HERE!

                    alarmInfoHandler = new AlarmInfoEventHandler(AlarmInfoHandler);
                    NewAlarmInfo += alarmInfoHandler;
                }

    //FUNCTION IN THE SAME SERVICE CALLED BY OTHER CLIENT
         public void PublishAlarm(string alarm)
                {
                    AlarmInfoEventArgs e = new AlarmInfoEventArgs();
                    e.Alarm = alarm;
                    NewAlarmInfo(this, e); 
                }

        public void AlarmInfoHandler(object sender, AlarmInfoEventArgs e)
                {
        List<IMonitoringWebServiceCallback> callbacks = AlarmCallbackSingleton.Instance.GetCallbacks();

    //EVERYONE THAT SUBSCRIBED SHOULD EXECUTE THIS (HERE I GET THE DISPOSED ERROR)
                    callbacks.ForEach(x => x.ShowString("String!"));
                }
4

1 回答 1

0

行。我得到了它!这个问题的答案很简单:

当您订阅服务时,您需要在某处(列表等)保存 OperationContext 而不是回调对象。然后,当另一个客户端调用 PublishAlarm 时,会触发该事件,您需要获取所有订阅的客户端的 OperationContext。我将这些对象保存在静态列表(单例类)中,仅用于示例。

然后:

 public void AlarmInfoHandler(object sender, AlarmInfoEventArgs e)
 {
    var operation = AlarmCallbackSingleton.Instance.operationContext
    var callback = operation.GetCallbackChannel<IMonitoringWebServiceCallback>();
    callback.ShowAlarm(); //function you want to call
 }

希望这可以帮助!

于 2013-07-25T14:44:59.867 回答