У меня есть рабочий ServiceHost с единственным NetTcpBinding и единственной конечной точкой.
Я .Close()
это. Затем я создаю новый экземпляр ServiceHost с той же самой конфигурацией как первая. Затем когда я пытаюсь .Open()
новый экземпляр я получаю это очень неловкое исключение:
System.ArgumentException occurred
Message=Instance 'LobbyService@net.tcp:||localhost:2718|game|' already exists in CounterSet 'e829b6db-21ab-453b-83c9-d980ec708edd'.
Parameter name: InstanceName
Source=System.Core
ParamName=InstanceName
StackTrace:
at System.Diagnostics.PerformanceData.CounterSetInstance..ctor(CounterSet counterSetDefined, String instanceName)
Кто-либо видел это прежде? Действительно ли это - ошибка в Платформе.NET (я использую 4.0, между прочим)?
Вероятно, соответствующая информация о моем ServiceHost:
IInstanceProvider
используется для создания экземпляров;ReliableSession
включен;ServiceBehavior
ниже;.
[ServiceBehavior(
IncludeExceptionDetailInFaults = true,
InstanceContextMode=InstanceContextMode.PerSession,
ConcurrencyMode=ConcurrencyMode.Reentrant,
UseSynchronizationContext = false
)]
Я открыт для раскрытия любой дополнительной информации, которую Вы могли бы хотеть знать о приложении.
Обновите 1, я скомпилировал приложение, предназначающееся для.NET 3.5, и ошибка НЕ сделала произошел. К сожалению, я должен деактивировать все, что положилось в Task
.
Обновите 2, я зарегистрировал ошибку в Microsoft Connect об этой проблеме. Я предполагаю, что на этот вопрос уже отвечают теперь.
Это ошибка .NET Framework 4.0. Я зарегистрировал ошибку в Microsoft Connect по этому поводу.
Вот ответ от Microsoft:
Похоже, это известная проблема, вызвавшая по тайминговым вопросам при плотном закрытии / открытии последовательность ServiceHost. ServiceHost поддерживает некоторые счетчики производительности это может не получить сборщик мусора что привело к этому исключению. Я предполагаю вы используете .Net Framework 4.0? Пожалуйста, попробуйте обходной путь, выполнив принудительный сборщик мусора перед открытием второго ServiceHost:
GC.Collect()
GC.WaitForPendingFinalizers()
Выполнение того, что они посоветовали, помогло решить проблему. Я надеюсь, что это будет исправлено в более позднем выпуске.