Я пишу TCP-сервер, и в его основе лежит довольно стандартный фрагмент кода bind-listen-accept, красиво инкапсулированный TcpListener
.Код, который я сейчас запускаю в разработке , работает , но я ищу обсуждение выбранной модели потока:
// Set up the socket listener
// *THIS* is running on a System.Threading.Thread, of course.
tpcListener = new TcpListener(IPAddress.Any, myPort);
tpcListener.Start();
while (true)
{
Socket so = tpcListener.AcceptSocket();
try
{
MyWorkUnit work = new MyWorkUnit(so);
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(DispatchWork);
bw.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(SendReply);
bw.RunWorkerAsync(work);
}
catch (System.Exception ex)
{
EventLogging.WindowsLog("Error caught: " +
ex.Message, EventLogging.EventType.Error);
}
}
Я видел хорошие описания такого родавыбранной модели потока (BackgroundWorker, Stock Thread или ThreadPool), но ни одна из них для подобной ситуации.Хорошая сводка плюсов и минусов каждого из них: backgroundworker-vs-background-thread (второй ответ).В приведенном выше примере кода я выбрал BackgroundWorker, потому что это было легко.Пришло время выяснить, является ли это правильным способом сделать это.
Это особенности этого приложения, и они, вероятно, довольно стандартны для большинства транзакционных TCP-серверов:
- Не приложение Windows Forms.На самом деле, он запускается как служба Windows.
- (я не уверен, должна ли порожденная работа быть потоком переднего плана или нет. Сейчас я запускаю их в качестве фона, и все в порядке.)
- Независимо от того, какой приоритет назначен потоку, он подходит, если цикл
Accept()
получает циклы. - Мне не нужен фиксированный идентификатор для потоков на более поздний период
Abort()
или любой другой. - Задачи, выполняемые в потоках, короткие - не более секунд.
- Потенциально множество задач может очень быстро попасть в этот цикл.
- «Изящный» способ отказаться (или поставить в очередь) новая работа была бы хороша, если бы у меня не было ниток.
Так какой же правильный путь для этого?