Я заметил, что некоторые из моих служб зависали, а не выключались, как было указано в инструкции, потому что они ожидали блокировок, удерживаемых другими службами, которые ожидают их выключения (вызывая тупик).Для этого мне нужно было каким-то образом сигнализировать потокам, ожидающим завершения блокировки, поэтому я придумал следующее:
public static Boolean Lock(this Mutex mutex)
{
Boolean achieved = false;
while (Thread.CurrentThread.ThreadState != System.Threading.ThreadState.StopRequested)
{
try
{
achieved = mutex.WaitOne(TimeSpan.FromSeconds(10.0));
}
catch (AbandonedMutexException exception)
{
// Log this
}
}
return achieved;
}
Когда каждый сервис останавливается, он вызывает Join для каждого из своих потоков.,Проблема в том, что даже после того, как Thread был вызван, ThreadState все еще имеет значение Running.В конце концов, соединение вступит в силу, и поток будет прерван, но я бы предпочел, чтобы он не пришел к этому.
Поэтому у меня два вопроса:
Есть ликаким-то образом поток узнает, что он присоединен (и, следовательно, может перестать ждать)?
Есть ли лучший способ решить эту проблему, чем то, что я придумал здесь?