Я запускаю свое приложение, которое порождает несколько потоков, каждый из которых создает NamedPipeServer (.net 3.5, добавленные управляемые типы для Named Pipe IPC) и ожидает, что клиенты будут подключаться (блоки). Код функционирует по назначению.
private void StartNamedPipeServer()
{
using (NamedPipeServerStream pipeStream =
new NamedPipeServerStream(m_sPipeName, PipeDirection.InOut, m_iMaxInstancesToCreate, PipeTransmissionMode.Message, PipeOptions.None))
{
m_pipeServers.Add(pipeStream);
while (!m_bShutdownRequested)
{
pipeStream.WaitForConnection();
Console.WriteLine("Client connection received by {0}", Thread.CurrentThread.Name);
....
Теперь мне также нужен метод Shutdown для чистоты этого процесса. Я попробовал обычный флаг bool isShutdownRequested трюк. Но pipestream остается заблокированным при вызове WaitForConnection(), и поток не умирает.
public void Stop()
{
m_bShutdownRequested = true;
for (int i = 0; i < m_iMaxInstancesToCreate; i++)
{
Thread t = m_serverThreads[i];
NamedPipeServerStream pipeStream = m_pipeServers[i];
if (pipeStream != null)
{
if (pipeStream.IsConnected)
pipeStream.Disconnect();
pipeStream.Close();
pipeStream.Dispose();
}
Console.Write("Shutting down {0} ...", t.Name);
t.Join();
Console.WriteLine(" done!");
}
}
Присоединиться никогда не возвращается.
Вариант, который я не пытался, но, возможно, работал, должен вызвать Thread.Abort и съесть исключение. Но он не чувствует себя хорошо.. Любые предложения
Обновление 2009-12-22
Извините за то, что вы не опубликовали это раньше. Это то, что я получил в ответ от Ким Хэмилтон (команда BCL)
"Правильный" способ сделать прерывание WaitForConnection - позвонить BeginWaitForConnection, обработать новый соединение в обратном вызове и закрытие поток трубы прекратит ждать соединения. Если труба закрыта, EndWaitForConnection будет бросать ObjectDisposedException, которое поток обратного вызова может ловить, очищать любые свободные концы и выйти чисто.
Мы понимаем, что это должно быть общим вопрос, так что кто-то из моей команды планируя блог об этом в ближайшее время.