【发布时间】:2013-08-23 15:59:46
【问题描述】:
所以我有一个引发事件的对象和一个托管在 Windows 服务中的 WCF 服务。
引发的事件当前位于 Windows 服务中的一个类中,WCF 服务订阅这些事件,当事件触发时,它们是对客户端的回调,让客户端知道在另一部分发生的事情视窗服务。
问题在于,回调有时有效,有时无效。我已经检查是否有任何客户可以回电,如果没有,我不打扰。我不确定实现这一点的最佳方法是因为有时:
call = OperationContext.Current.GetCallbackChannel<IRiskEoDWCFEvents>();
由于进入 WCF 服务的事件来自 Windows 服务的另一部分(A 类)而不是来自 OperationContext,因此在它异常或设置为 null 的其他时间获取回调。
简而言之 如何设置我的 WCF 服务以在我的 Windows 服务的另一部分发生事件时向客户端发出警报?
(更多代码)
在发布事件之前,我会进行这样的检查(只有在我们有客户时才会发布):
private void Publish(EoDEvent eodListEvent, EoDItem item)
{
if ( _EoDEventSubscribers == null || _EoDEventSubscribers.Count == 0)
{
//Cannot publish because we have no one listening
return;
}
.....
然后我把它全部发布出来:
Thread myThread = new Thread(myObject =>
{
lock (_SubscriberLock)
{
foreach (IRiskEoDWCFEvents callback in _EoDEventSubscribers)
{
if (callback.GetHashCode() != myObject.GetHashCode())
{
Logging.WriteLine("Sending event to {0}", callback.GetHashCode());
try
{
if (eodListEvent == EoDEvent.EoDComponentStarted)
callback.EoDComponentStarted(item);
else if (eodListEvent == EoDEvent.EoDComponentCompleted)
callback.EoDComponentCompleted(item);
.....
}
catch (Exception ex)
{
FaultException faultex = ex as FaultException;
if (faultex == null)
{
Logging.WriteLine("Callback failed, removing {0}", callback.GetHashCode());
toRemove.Add(callback);
}
}
}
}
if (toRemove.Count > 0)
{
foreach (IRiskEoDWCFEvents cb in toRemove)
{
_EoDEventSubscribers.Remove(cb);
}
}
}
});
myThread.Priority = ThreadPriority.Highest;
myThread.Start(call);
【问题讨论】:
标签: c# .net wcf callback duplex