Я запускаю свое приложение, которое порождает несколько потоков, каждый из которых создает NamedPipeServer (добавлены управляемые типы .net 3.5 для 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);
....
Теперь мне также нужен метод завершения работы, чтобы аккуратно остановить этот процесс. Я попробовал обычный флаг bool isShutdownRequested трюк. Но поток вызовов остается заблокированным при вызове 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, который
нить обратного вызова можно ловить, убирать
любые свободные концы, и выходите чисто.
Мы понимаем, что это должно быть общим
вопрос, так что кто-то в моей команде
планирую написать об этом в ближайшее время.