WCF уведомляет подписчиков асинхронно - PullRequest
4 голосов
/ 25 апреля 2011

Это мой сервис 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);
                }
            });
   }
}

1 Ответ

1 голос
/ 25 апреля 2011

Вы можете поместить его в пул потоков:

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

Просто помните, что это может засорить ваш пул потоков, когда у вас много плохих подписчиков. Вы, вероятно, хотите перехватить исключения и удалить обратный вызов, если он не прошел.

Обновление : если вы не хотите использовать пул потоков .NET, вы можете либо свернуть свой собственный, либо, например, использовать SmartThreadPool

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...