【发布时间】:2011-04-25 08:15:17
【问题描述】:
这是我的 WCF 服务。我想通知多个订阅者 一些更新并异步执行。我怎么做?
// Callback contract
public interface IMyServiceCallback
{
[OperationContract]
void Notify(String sData);
}
public class MyService:IMyService
{
List<IMyServiceCallback> _subscribers = new List<IMyServiceCallback>();
// This function is used to subscribe to service.
public bool Subscribe()
{
try
{
IMyServiceCallback callback = OperationContext.Current.GetCallbackChannel<IMyServiceCallback>();
if (!_subscribers.Contains(callback))
_subscribers.Add(callback);
return true;
}
catch
{
return false;
}
}
// this function is used to notify all the subsribers
// I want ForEach to be asynchronous.
public void OnGetMsg(string sData)
{
_subscribers.ForEach(
callback =>
{
if (((ICommunicationObject)callback).State == CommunicationState.Opened)
{
callback.Notify(sData); //THIS OPERATION
}
else
{
_subscribers.Remove(callback);
}
});
}
}
【问题讨论】:
-
另外,我是唯一一个认为 WCF 是颈部疼痛的人吗? (你知道我说的脖子是什么意思。)
-
你的问题在哪里?异常还是逻辑(算法)问题?
-
如果其中一个订阅者死了,那么
callback.Notify()就会出现超时异常。因为这个通知给其他订阅者被延迟了。 -
如果您不在该方法中处理 TimeoutException,则 ForEach 将中断,就像等待其他进程完成一样。您是否在 callback.Notify 方法()中处理异常?
-
我可以处理
TimeoutException但它不会阻止延迟通知其他订阅者。