c# – WCF异步通知订户
发布时间:2020-12-15 21:17:25 所属栏目:百科 来源:网络整理
导读:这是我的WCF服务.我想通知多个订阅者 一些更新,并以异步方式进行.我怎么做? // Callback contractpublic interface IMyServiceCallback{ [OperationContract] void Notify(String sData); }public class MyService:IMyService{ ListIMyServiceCallback _sub
这是我的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); } }); } } > “MSDN: WCF Publisher/Subscriber Client crashing” is strongly related to my problem. 解决方法
你可以把它放到线程池:
ThreadPool.QueueUserWorkItem(o => callback.Notify(sData)); 请注意,当您有许多不良订阅者时,它可能会阻塞您的线程池.您可能希望捕获异常并在失败时删除回调. 更新:如果您不想使用.NET线程池,那么您可以自己滚动,也可以使用SmartThreadPool (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |