【问题标题】:WCF Notify subscribers asynchronouslyWCF 异步通知订阅者
【发布时间】: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 但它不会阻止延迟通知其他订阅者。

标签: c# wcf callback


【解决方案1】:

可以放到线程池中:

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

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

更新:如果您不想使用 .NET 线程池,那么您可以自行开发或使用 SmartThreadPool

【讨论】:

  • 这不是一个好主意,因为您很可能会消耗应该由 WCF 引擎用来处理传入请求的线程。
猜你喜欢
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 2021-08-21
相关资源
最近更新 更多