c# - WCF 异步通知订阅者

标签 c# wcf callback

这是我的 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);
                }
            });
   }
}

最佳答案

可以放到线程池中:

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

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

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

关于c# - WCF 异步通知订阅者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5776524/

相关文章:

c# - 为什么C#中有Console.Error(),却没有Console.Warning?

c# - 从 Azure ServiceConfig 调用 WCF 服务

.net - 禁用 "application has stopped working"窗口

c# - 在 WCF 服务和客户端之间共享接口(interface)(标记为 w/ServiceContract)

c# - 算法进度回调

c++ - 使用类成员函数作为回调

jquery - MathJax:尝试重新呈现数学时无法从给定数据进行回调

c# - Entity Framework - 加载子集合,按子属性排序

c# - 使用语句不能正常工作

c# - 提交表单时模型集合丢失