加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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.
>我在创建此服务时遵循了Mini Webcast.

解决方法

你可以把它放到线程池:

ThreadPool.QueueUserWorkItem(o => callback.Notify(sData));

请注意,当您有许多不良订阅者时,它可能会阻塞您的线程池.您可能希望捕获异常并在失败时删除回调.

更新:如果您不想使用.NET线程池,那么您可以自己滚动,也可以使用SmartThreadPool

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读