으로 ManualResetEvent 뭔가를 구현하는 나를 놀라게하는 동안, 으로 ManualResetEvent (EventWaitHandle) 세트 WaitOne (시간 초과)보다 더 많은 CPU를 보낸다
지금까지 내가mre.Set()
명령 신호를 이해하고 다른 프로세스가 실행 할 수있다.
mre.WaitOne();
현재 라인을 유지하고 신호를 기다립니다. 시간 제한과 함께 사용하면이 옆에 mre.WaitOne(100ms);
그러나! StartCommunicate이 스레드의 작업이라고 가정 해 봅시다.
waitHandle.Set();
을 사용하는 경우 내 프로세스가 ~ % 25 또는 다른 프로젝트 ~ % 1 CPU 리소스를 사용합니다.
그러나 waitHandle.WaitOne(100);
을 사용하는 경우 (시간 초과 값은 기호입니다 (100ms 동안 신호를 기다립니다).
~ % 0 CPU 리소스를 사용하여 프로세스가 시작됩니다. waitone (시간 초과) 어떤 의미입니까? ThereAsAJobToExecute은 입니다. Socket.HasData입니다. 그렇다면 SerialPort.BytesToRead 또는 Socket.Available으로 CPU 사용률을 높이는 것이 좋습니다.
매 히트마다 100ms 동안 스레드를 유지하는 부작용이 있습니까? 소켓 프로그램이나 rs232 연결 전송 속도가 비교적 낮은 차세대 PC라고 가정합니다.
따라서 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);
}
}
}
편집 : 소켓이 작동 할 수 있습니다 프로그래밍을위한ASYN
그래서 우리는 아래의 코드에 의해 그것을 할 쉽게 할 수 있고 우리가 폴링을 필요가 없습니다.
하지만 RS232 COMM 포트 프로그래밍이 필요합니다. 안 그래요?
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'은 거의 교환 할 수 없습니다. 이 사건에 왜 그들이 있다고 생각하는지는 나에게는 불분명하다. –
일반적으로 'JobToExecute'를 생성하는 것은 신호를 처리합니다. 그것은 스레드 간 통신의 요점인데, 필요한 폴링은 없습니다. –
@MartinJames 더 명확하게하기 위해 질문을 편집 할 것입니다. –