Разве это не случай, когда отключенный клиент вызывает возникновение события, которое вызывает исключительную ситуацию при обработке его списка вызовов, и, следовательно, все остальные клиенты не вызываются; вы можете обработать список вызовов вручную примерно так
List<Action<string>> targets = _action.GetInvocationList().Cast<Action<string>>().ToList();
foreach(var target in targets)
{
try
{
target(message);
}
catch(CommunicationException)
{
_action -= target;
}
}
Редактировать (посмотрев на код)
Вы используете NetTcpBinding, который по своей природе сессионный . Этот сеанс будет разорван (отключен) в одной из двух ситуаций - когда клиент закрывает свой прокси-сервер или , когда между запросами превышается значение receiveTimeout службы.
На вашем хосте PubSubService вы установили тайм-аут приема (который влияет на сеансы подписчиков) на 5 секунд, так же как и на sendTimeout (который влияет на время, которое вы будете ждать, прежде чем решите, что подписчик мертв, когда вы вещаете). Таким образом, к тому моменту, когда вы понимаете, что подписчик мертв, все остальные подписчики завершили свои сеансы по тайм-ауту
Увеличьте значение receiveTimeout на хосте PubSubService до того времени, когда вы хотите, чтобы подписка была действительной, и она будет работать нормально