При реализации ManualResetEvent меня что-то удивило,
Насколько я понимаю mre.Set()
подает команду и позволяет другим процессам выполняться.
mre.WaitOne();
Держится на текущей линии и ждет сигнала. Кроме того, если мы используем его с тайм-аутом mre.WaitOne(100ms);
НО! Предположим, что StartCommunicate — это задание потока.
Если я использую waitHandle.Set();
, мой процесс использует ~%25 или для другого проекта ~%1 ресурс ЦП.
Но если я использую waitHandle.WaitOne(100);
(значение тайм-аута символическое. Он (попытка) ждет сигнала в течение 100 мс).
Процесс начинает использовать ~%0 ресурсов ЦП с waitone(timeout) Что это значит? ThereIsAJobToExecute — это Socket.HasData для меня. Значит ли это, что частое нажатие на SerialPort.BytesToRead или Socket.Available повышает загрузку ЦП?
Есть ли какой-либо побочный эффект для меня, удерживая поток в течение 100 мс для каждого попадания? Предположим, что программа сокетов или скорость передачи данных соединения rs232 очень низкая по сравнению с ПК нового поколения.
Поэтому использование mre.WaitOne(1);
кажется мне более предпочтительным. Что вы думаете об этом ? Я провожу некоторые эксперименты с некоторыми профилировщиками памяти и производительности, но я не уверен, делаю ли я оптимальное решение для различных клиентских машин или нет...
Жду ваших комментариев.
Заранее спасибо!
ManualResetEvent waitHandle = new ManualResetEvent(false);
public void StartCommunicate()
{
while (true)
{
if (ThereIsAJobToExecute)
{
Execute the job here!
}
else {
//waitHandle.Set();
waitHandle.WaitOne(1);
}
}
}
EDIT: Для программирования Socket доступна работа ASYN
, поэтому мы можем легко сделать это с помощью приведенного ниже кода, и нам не нужен опрос.
Но программирование COMM-порта RS232 мне нужно. Или не ?
do
{
socket.BeginReceiveASYN(....ReceiveCallBack,...,socket)
mre.WaitOne();
mre.Reset();
}while(true)
void ReceiveCallBack(IResult rst)
{
//get the socket and do my job here!
mre.Set();
}
Set()
иWaitOne
редко взаимозаменяемы. Мне непонятно, почему вы думаете, что они в этом случае. - person Damien_The_Unbeliever   schedule 19.03.2014Set
иWaitOne
ортогональны. и .. кстати, ваш код асинхронного сокета тратит поток на ожидание, вы не получаете никакой масштабируемости от асинхронного, таким образом, лучше использовать синхронные сокеты, чем создавать поток для ожидания, пока вы не получите данные. - person Sriram Sakthivel   schedule 19.03.2014if (SerialPort.BytesToRead>0)
в бесконечном цикле. Это проблема. Я ошибся ? Есть ли способ уведомления о новых доступных данных на последовательном порту? Если это так, то все в порядке. - person Davut Gürbüz   schedule 19.03.2014DataReceived
, я его использую. Тогда не нужно голосование для этого. - person Davut Gürbüz   schedule 19.03.2014