2012-09-22 3 views
1

У меня есть программа, которая извлекает данные с последовательного устройства, а затем помещает его на сервер, доступный для определенных программ, которые могут обрабатывать этот протокол. Этот сервер является сторонней программой, которая находится в форме активного элемента управления x.Запуск сервера в отдельном потоке

Для аппаратных устройств требуется Thread.Sleep, что является неудачным. Программы, которые контролируют сервер, иногда запрашивают сервер во время спящего потока. Это заставляет думать, что сервер потерпел неудачу.

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

 Thread workerThread = new Thread(DoServerWork); 
     workerThread.SetApartmentState(ApartmentState.STA); 
     workerThread.Start(); 

В делегатом, я

public void DoServerWork() 
    { 
     rtu = new AxASMBSLVLib.AxASMBSLV(); 
     rtu.CreateControl(); 
     rtu.BeginInit(); 
     rtu.OpenPort(); 

     while (true) 
     { 

     } 
    } 

Проблема заключается в том, что сервер начинает работать, а затем перестает отвечать на запросы в течение примерно 5 секунд. Моя первоначальная мысль заключается в том, что поток выходит, но while (true) должен помешать этому. Есть предположения?

+1

'while (true)' будет потреблять много процессорного времени. Разве вы не слышали, как фанаты готовятся? –

+0

Да, я знаю. Сначала у меня был Thread.Sleep (1), но та же проблема была. – Tim

ответ

0

Это ведомое устройство Modbus TCP/IP от сторонней компании. Первый вариант - «перетащить» его из панели инструментов в графический интерфейс, в результате чего он будет включен в поток пользовательского интерфейса.

Поскольку для использования ActiveX требуется STA: это точно.

Я должен вызвать Thread.Sleep в потоке пользовательского интерфейса,

, что никогда не должно быть необходимым, здесь лежит ваш реальную проблему. Никогда не блокируйте/не спать основную нить.

Ваш вопрос должен быть о том, как избежать сна().

+0

Да, я думаю, вы правы. Похоже, мне придется быть более креативными в этом вопросе. – Tim

2

Поскольку вы используете это в однопоточной квартире (STA), как только эта нить попадает в пустой бесконечный цикл, больше ничего не может произойти. Бесконечный цикл, как правило, не очень хорошая идея. Вероятно, вы должны использовать таймер для периодической работы сервера в обработчике событий OnElapsed.

+0

Единственная проблема заключается в том, что сервер должен быть готов все время отвечать на запросы внешней программы. Я просто не знал, как сохранить этот поток навсегда, кроме бесконечного цикла. – Tim

+0

Вам необходимо запустить сервер с асинхронным (блокирующим) вводом-выводом. Единственный разумный вариант. –

+0

Как я могу реализовать это в моем случае? – Tim

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