private void Publish(TodoListEvent todoListEvent, TodoItem item) { ITodoListEvents callback = OperationContext.Current.GetCallbackChannel <ITodoListEvents>(); Thread t = new Thread(x => { List <ITodoListEvents> toremove = new List <ITodoListEvents>(); lock (_SubscriberLock) { foreach (ITodoListEvents cb in _TodoListEventSubscribers) { if (cb.GetHashCode() != x.GetHashCode()) { Console.WriteLine("Sending event to {0}", cb.GetHashCode()); try { if (todoListEvent == TodoListEvent.ItemAdded) { cb.ItemAdded(item); } else if (todoListEvent == TodoListEvent.ItemChanged) { cb.ItemChanged(item); } else if (todoListEvent == TodoListEvent.ItemDeleted) { cb.ItemDeleted(item.ID); } } catch (Exception ex) { FaultException faultex = ex as FaultException; if (faultex == null) { Console.WriteLine("Callback failed, removing {0}", cb.GetHashCode()); toremove.Add(cb); } } } } if (toremove.Count > 0) { foreach (ITodoListEvents cb in toremove) { _TodoListEventSubscribers.Remove(cb); } } } }); t.Start(callback); }
public void Unsubscribe() { ITodoListEvents callback = OperationContext.Current.GetCallbackChannel <ITodoListEvents>(); lock (_SubscriberLock) { if (_TodoListEventSubscribers.Contains(callback)) { Console.WriteLine("Removing callback {0}", callback.GetHashCode()); _TodoListEventSubscribers.Remove(callback); } } }