2011-04-25 77 views
4

这是我的WCF服务。我想通知 多个订户并进行一些更新并异步执行。我怎么做?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); 
       } 
      }); 
    } 
} 
+0

另外,我是谁认为WCF是在痛苦中唯一一个颈部? (你知道我的意思。) – 2011-04-25 08:33:51

+0

你的代码在哪里?异常或逻辑(算法)问题? – 2011-04-25 08:47:54

+0

如果其中一个用户死了,那么'callback.Notify()'会出现超时异常。由于向其他用户发送的通知延迟了。 – 2011-04-25 08:50:38

回答

1

你可以把它的线程池:

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

要知道,当你有很多不好的用户可能会堵塞你的线程池。您可能想要捕获异常并在失败时删除回调。

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

+0

这不是一个好主意,因为您很可能会使用WCF引擎用来处理输入请求的线程。 – 2011-04-25 10:56:26

+0

然后使用不同的线程池 – ChrisWue 2011-04-25 11:09:08