ManualResetEvent を実装しているときに、何か驚いたことがあります。
mre.Set()
コマンド信号を理解し、他のプロセスを実行できる限り。
mre.WaitOne();
現在の行を保持し、シグナルを待ちます。これに加えて、タイムアウトで使用する場合mre.WaitOne(100ms);
しかし!StartCommunicateがスレッドの仕事であるとしましょう。
waitHandle.Set();
私のプロセスが ~%25を使用する場合、または別のプロジェクトでは ~%1 の CPU リソースを使用します。
しかし、私が使用する場合 waitHandle.WaitOne(100);
(タイムアウト値はシンボリックです。100ms の信号を (試行) 待ちます)。
プロセスは、 waitone(timeout)で ~%0 の CPU リソースを使用して開始し ます。これはどういう意味ですか? 私にとってThereIsAJobToExecuteはSocket.HasDataです。では、 SerialPort.BytesToReadまたはSocket.Availableに多くヒットすると、CPU 使用率が高くなるということですか?
ヒットごとに 100 ミリ秒スレッドを保持することは、副作用がありますか? ソケットプログラムまたは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();
}