1

コンストラクターで Windows フォーム タイマーを初期化しました (「pTimer.Enabled=true」と記述して、適切な時間にタイマーを実行するように設定しました。コンストラクターでは、

            pTimer = new Timer();
            pTimer.Enabled = false; 
            pTimer.Interval = timerSpeed;
            pTimer.Tick += new EventHandler(pTimer_Tick);

タイマー コールバック内で、作業が完了したかどうかを確認しています。それが終わったら、タイマーを停止し (pTimer_Tick コールバックを呼び出し続けないという意味で)、ロギングを行っているストリームライターを閉じたいと思います。

           private void pTimer_Tick(object sender, EventArgs e)
           {
                bool tempFinished = finished();
                log("finished() in timer tick = " + tempFinished.ToString());
                if (tempFinished)
                {
                     if (pTimer.Enabled == true)
                     {
                         log("We are going to stop the timer");
                         pTimer.Enabled = false;
                         Application.DoEvents();
                         log("We are going to close the streamwriter");
                         //myStreamWriter.Close();
                     }
                }
           }

次の動作が発生するようです。

  1. pTimer_Tick コールバックで最初に finished()==true になった後、「finished() in timer tick = True」をログに記録し、コードは pTimer.Enabled = false に到達します。
  2. もともと、私はストリームライターを閉じることをコメントアウトしていませんでした。これは、pTimer_Tick コールバックからログに記録されているコードへの書き込みを試行し続けていたため、エラーを生成していました。
  3. myStreamWriter.Close(); をコメントアウトすると、(上記のように) 1. が発生した後、コードは実際に pTimer_Tick コールバックを再入力し続けているように見えます。「bool tempFinished=finished()」行に到達すると、finished() メソッドが実行され、内部ログが終了しました。 () メソッドは、期待どおりに再び「true」を出力することを示していますが、次の行のログ「 log("finished() in timer tick = " + tempFinished.ToString());" ログに次に現れるのは、finished() 関数に再びアクセスするコードです。

ここで何が間違っている可能性があるかについて誰か提案がありますか?

ありがとう!クリス

4

1 に答える 1

-1

プロパティを設定して、タイマーを開始および停止しEnabledます。コメントでこれで十分だとおっしゃっていますが、私は確信していません。

代わりにStart、タイマー機能を使用してみてください。Stop

于 2012-09-18T16:52:11.650 に答える