2013-10-04 3 views
1

Мое приложение предназначено для прослушивания входящих сообщений от клиентов через TCP. Я использую TCPListner и метод BeginAcceptTcpClient. При подключении установлено, что я делаю, создавая новый поток для каждого соединения, используя: ThreadPool.QueueUserWorkItem (новый WaitCallback (HandleClientCommNew), клиент);TCPListener многопотоковая связь с несколькими клиентами

Мой вопрос здесь в том, что происходит с потоком, когда функция обратного вызова завершает работу. Если ответ заключается в том, что он заканчивается сам по себе, моя проблема в том, что это не так, и я получаю огромное количество потоков, зависающих в моем процессе, иначе лучшая практика прекращения потока.

С одной стороны, клиенты, о которых идет речь, обрабатывают соединения и разъединения по своему усмотрению, я должен контролировать их.

EDIT

public void Init() 
{ 
    this.tcpListener = new System.Net.Sockets.TcpListener(IPAddress.Parse("0.0.0.0"), 1000); 
    this.listenThread = new Thread(new ThreadStart(ListenForClients)); 
} 

private void ListenForClients() 
{ 
    this.tcpListener.Start(); 
    StartAccept(); 
} 

public void StartAccept() 
{ 
    this.tcpListener.BeginAcceptTcpClient(new AsyncCallback(DoAcceptTcpClientCallback), tcpListener); 

} 

public void DoAcceptTcpClientCallback(IAsyncResult ar) 
{ 
    StartAccept(); 
    TcpListener listener = (TcpListener)ar.AsyncState; 
    TcpClient client = listener.EndAcceptTcpClient(ar); 
    ThreadPool.QueueUserWorkItem(new WaitCallback(HandleClientCommNew), client); 
} 

private static void HandleClientCommNew(object stateInfo) 
{ 
    TcpClient tcpClient = (TcpClient)stateInfo; 
    AsyncCallback callback = null; 
    callback = ar => 
    { 
      bytesRead = clientStream.EndRead(ar); 
      clientStream.BeginRead(message, 0, 4500, callback, null); 
    } 

    clientStream.BeginRead(message, 0, 4500, callback, null); 
} 
+0

ThreadPool.QueueUserWorkItem не создает специальный поток для каждого как таковые. Откуда вы знаете, что у вас много «витков» в вашем процессе? Где вы это видите? – hawk

+0

Widnows 7 Resource Monitor – ancdev

+0

Это только темы ThreadPool. Типичный процесс .net будет содержать много потоков Managed (и O/S level), которые относятся к threadpool. Вам не нужно беспокоиться о их прекращении. – hawk

ответ

1

, что происходит в потоке, когда функция обратного вызова завершает свою работу.

Вы можете думать о потоковых потоках как о роботах или агентах, ожидающих назначения им задач. Они просто продолжают работать над задачами, назначенными им, и после выполнения задачи они ждут больше задач. Вам не нужно прекратить их, что ответственность лежит с классом ThreadPool

http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

0

Когда очередь метода в ThreadPool, будет снимаемым на волоске от ThreadPool. Когда метод завершится, поток будет ждать другого задания. Вы должны ставить в очередь многократные задания на ThreadPool, например, ждать приема данных. Есть ограниченные потоки, обрабатывающие задания, стоящие в очереди на threadpool. Поэтому, если у вас есть клиенты ThreadPool.GetMaxThreads, ваше приложение не может обрабатывать больше клиентов.


Вы не должны использовать ThreadPool для соединений.

Скорее используйте асинхронный BeginReceive/EndReceive. Потому что они используют Поля ввода-вывода ввода-выводаhttp://msdn.microsoft.com/en-us/library/windows/desktop/aa365198(v=vs.85).aspx и не блокируют поток ThreadPool во время ожидания. Когда некоторые данные будут прочитаны, новое задание будет поставлено в очередь на ThreadPool. (Так что не ждет там)

Псевдо:

StartListening() <-----------------------------------------------+ 
{                | 
    BeginAcceptTcpClient(... EndListening); >----+    | 
}            |    | 
               |    | 
EndListening() <---------------------------------+    | 
{                | 
    TcpClient client = EndAcceptTcpClient(..);     | 
                   | 
    StartClientReceiving(client); >--------------------------+ | 
                  | | 
    StartListening(); >-------------------------------------/#\--+ 
}               | 
                  | 
StartClientReceiving(TcpClient client) <---------------------+ 
{               \ 
    client.BeginReceiving(....EndClientReceiving) >---+ | 
}              | | 
                 | | 
EndClientReceiving() <--------------------------------+ | 
{               | 
    // if no datareceived, disconnect.      | 
    // HandleData           | 
    StartClientReceiving(); >------------------------------+ 
} 

У меня есть пример сокета слушателя/читателя на моем блоге: http://csharp.vanlangen.biz/network-programming/async-sockets/

+0

Что случилось с использованием ThreadPool? – ancdev

+0

_There ограниченные потоки, обрабатывающие задания, поставленные в очередь на threadpool. Поэтому, если у вас есть клиенты ThreadPool.GetMaxThreads *, ваше приложение не может обрабатывать больше клиентов. И сообщение становится плохой. (таймауты) Это не значит, что использование «ThreadPool» неверно, но ожидание на «ThreadPool» не рекомментировано. –

Смежные вопросы