2011-01-13 4 views
1

У меня есть C# HttpListener, который работает на одном потоке и анализирует данные, отправленные ему другой программой. Моя основная проблема - это не все данные, отправленные на сервер. Я предполагаю, что это связано с тем, что он запускается в одном потоке. Я искал высокий и низкий для простого многопоточного решения, чтобы он мог получить все данные, отправленные ему, и подошел с пустыми руками. Любая помощь в преобразовании этого в многопоточное приложение будет высоко оценена.Переключатель C# от одного до нескольких потоков

private void frmMain_Load(object sender, EventArgs e) 
    { 
     Thread t = new Thread(new ThreadStart(ThreadProc)); 
     t.Start(); 
    } 

    public static void ThreadProc() 
    { 
     while (true) 
     { 
      WebBot.SimpleListenerExample(new string[] { "http://localhost:13274/" }); 
      //Thread t = new Thread(new ThreadStart(ThreadProc)); 
      //t.Start(); 
      Application.DoEvents(); 
     } 
    } 

ответ

1

Прежде всего, убедитесь, что ваша гипотеза действительно правильная. Вы должны проверить:

  1. Сколько данных передается
  2. Сколько данных получено
  3. Сколько времени потребуется, чтобы отправить данные
  4. Сколько времени потребуется, чтобы работать на данных

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

Тем не менее, если вы все еще хотите, чтобы сделать процесс многопоточный, я бы рекомендовал следующую конструкцию:

  1. Один поток, как вы уже сейчас (СЛУШАТЕЛЬ НИТИ), который принимает входящие данные ,
  2. Другой набор потоков, которые будут обрабатывать поступающие данные (РАБОЧИЕ РЕЗЬБЫ).
  3. Поток слушателя будет принимать данные только и помещать их в очередь.
  4. Рабочие потоки деактивируют очередь и работают с данными.

Несколько заметок и вещи, чтобы думать, хотя:

  1. Позаботьтесь о синхронизации потоков - в частности, необходимо для защиты очереди.
  2. Думайте, если это имеет значение, какой рабочий поток получит данные. Если есть несколько фрагментов, которые необходимо позаботиться о конкретном рабочем потоке, вам необходимо решить эту проблему.
  3. В некоторых случаях, если на поток слушателя очень высока загрузка, очередь может стать узким местом, а точнее - блокировка в очереди может стать узким местом. В этом случае я бы рекомендовал переместиться в модель из N очередей для N рабочих потоков, и слушатель просто выбирает один по круговой схеме. Это минимизирует блокировки, и на самом деле, поскольку у вас будет один читатель и один писатель, вы можете даже уйти без блокировки (но это не подходит для этого ответа).

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

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