18

Windows.Forms.Timerコードに、3回実行しているがあります。ただし、タイマーはティック関数をまったく呼び出していません。

private int count = 3;
private timer;
void Loopy(int times)
{
    count = times;
    timer = new Timer();
    timer.Interval = 1000;
    timer.Tick += new EventHandler(timer_Tick);
    timer.Start();
}

void timer_Tick(object sender, EventArgs e)
{
    count--;
    if (count == 0) timer.Stop();
    else
    {
        // Do something here
    }
}

Loopy()コード内の他の場所から呼び出されています。

4

8 に答える 8

52

Windows.Forms.Timerの代わりにSystem.Timersを使用してみてください

void Loopy(int times)
{
    count = times;
    timer = new Timer(1000);
    timer.Enabled = true;
    timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
    timer.Start();
}

void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    throw new NotImplementedException();
}
于 2012-11-16T07:33:25.777 に答える
8

メソッドLoopy()がメインUIスレッドではないスレッドで呼び出された場合、タイマーは作動しません。コード内のどこからでもこのメソッドを呼び出したい場合は、InvokeRequiredプロパティを確認する必要があります。したがって、コードは次のようになります(コードがフォームにあると仮定):

        private void Loopy(int times)
        {
            if (this.InvokeRequired)
            {
                this.Invoke((MethodInvoker)delegate
                {
                    Loopy(times);
                });
            }
            else
            {
                count = times;
                timer = new Timer();
                timer.Interval = 1000;
                timer.Tick += new EventHandler(timer_Tick);
                timer.Start();
            }
        }
于 2015-05-04T15:06:14.307 に答える
2

私はあなたが間違っていることをよくわかりません、それは正しいように見えます、このコードは機能します:それがあなたのものとどのように比較されるかを見てください。

public partial class Form1 : Form
{
    private int count = 3;
    private Timer  timer;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Loopy(count);
    }

    void Loopy(int times)
    {
        count = times;
        timer = new Timer();
        timer.Interval = 1000;
        timer.Tick += new EventHandler(timer_Tick);
        timer.Start();
    }

    void timer_Tick(object sender, EventArgs e)
    {
        count--;
        if (count == 0) timer.Stop();
        else
        {
            //
        }
    } 

}
于 2012-11-16T07:33:11.573 に答える
2

動作するRxティッカーは次のとおりです。

Observable.Interval(TimeSpan.FromSeconds(1))
.Take(3)
.Subscribe(x=>Console.WriteLine("tick"));

もちろん、あなたはあなたのプログラムでもっと役に立つ何かを購読することができます。

于 2012-11-16T07:34:25.017 に答える
1

Windows.Forms.Timerを使用している場合は、次のようなものを使用する必要があります。

//Declare Timer
private Timer _timer= new Timer();

void Loopy(int _time)
{

    _timer.Interval = _time;
    _timer.Enabled = true;
    _timer.Tick += new EventHandler(timer_Elapsed);
    _timer.Start();
}

void timer_Elapsed(object sender, EventArgs e)
{
    //Do your stuffs here
}
于 2018-09-20T06:45:42.430 に答える
1

プロパティのタイマーが有効になっているかどうかを確認します。鉱山は偽であり、真に設定した後、それは機能しました。

于 2020-07-09T07:09:20.737 に答える
0

タイマー内の間隔よりも小さい遅延を使用すると、system.timerは他のスレッドを実行するため、同時に実行されているダブルスレッドを処理する必要があります。InvokeRequiredを適用して、フローを制御します。

于 2020-11-21T05:04:25.887 に答える
0

別のスレッドからタイマーを開始した可能性があるため、正しいスレッドからタイマーを呼び出してみてください。 たとえば、次の代わりに:

timerX.start();

使用する:

Invoke((MethodInvoker)delegate { timerX.Start(); });
于 2021-12-31T09:56:00.837 に答える