-3

C# でタイマーを使用する方法を見つけようとしましたが、どのチュートリアルも本当に理解できませんでした。1秒待ってから何かを実行するループを取得したい(Thread.Delayではなく、他のことが起こっているときに同時に実行できるもの)。誰かが親切にコードの書き方を教えてくれたり、初心者が理解できるサンプルを書いてくれたりしたら、とても感謝しています。

    public partial class Char1 : Form
{
    private static System.Timers.Timer aTimer;
    public static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        Mainprog.count += 1;
    }
    public Char1()
    {
        InitializeComponent();
    }

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        while (checkBox1.Checked)
        {
            aTimer.Interval = 2000;
            aTimer.Enabled = true;
            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

        }
    }
}

2秒ごとにイベントを呼び出そうとしましたが、クラッシュします。これを修正する方法について何か考えはありますか?

4

4 に答える 4

2

while ループでタイマーを有効にしないでください。while ループに eventlistners を追加しないでください。これがプログラムがクラッシュする理由です。また、timer.start() は私が使用するものです。タイマーに慣れていません。 .enable 次のように試してください:

public partial class Char1 : Form
{
    private System.Timers.Timer aTimer;

    public static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        Mainprog.count += 1;
    }
    public Char1()
    {
        InitializeComponent();
        aTimer = new Timer();
        aTimer.Interval = 2000;
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    }

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        if(checkBox1.Checked)
        {
            aTimer.Start();
        }
        else
        {
            aTimer.Stop();
        }
    }
}

チェックボックスがオンまたはオフのときに間隔を変更したい場合を除き、コンストラクターでタイマーをインスタンス化し、そこで間隔を定義します。

于 2013-10-14T12:45:19.020 に答える
1

あなたの(最近追加された)コード

    while (checkBox1.Checked)
    {
        aTimer.Interval = 2000;
        aTimer.Enabled = true;
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    }

いくつかの問題が含まれています:

  • チェックボックスをオンにすると、無限ループに陥ります (チェックボックスをオフにする時間がありません)。
  • そのループでは、+=新しいイベント ハンドラをタイマーに () 追加し続けるので、タイマーが起動すると、何千ものOnTimedEvent呼び出しが発生します。

解決策: を に置き換え、その行をフォームの構築に移動whileifて、OnTimedEvent を 1 回だけ追加するようにします。

于 2013-10-14T12:39:54.863 に答える
1

最近の最も簡単な方法:

while(true) {
    await Task.Delay (1000);
    DoSomething ();
}
于 2013-10-14T12:19:44.760 に答える