0

ManualResetEvent を実装しているときに、何か驚いたことがあります。

mre.Set()コマンド信号を理解し、他のプロセスを実行できる限り。

mre.WaitOne();現在の行を保持し、シグナルを待ちます。これに加えて、タイムアウトで使用する場合mre.WaitOne(100ms);

しかし!StartCommunicateがスレッドの仕事であるとしましょう。

waitHandle.Set();私のプロセスが ~%25を使用する場合、または別のプロジェクトでは ~%1 の CPU リソースを使用します。

しかし、私が使用する場合 waitHandle.WaitOne(100);(タイムアウト値はシンボリックです。100ms の信号を (試行) 待ちます)。

プロセスは、 waitone(timeout)で ~%0 の CPU リソースを使用して開始し ます。これはどういう意味ですか? 私にとってThereIsAJobToExecuteSocket.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();
     }
4

2 に答える 2

1

WaitOneスレッドを一時停止状態にします。これにより、CPU リソースは消費されません。後者からのシグナルManualResetEventがスレッドを目覚めさせます。

于 2014-03-19T15:54:51.617 に答える