1

Silverlight C# ボタン クリック イベントを使用して、クリック後 10 秒一時停止し、特定の条件が満たされるまで x 秒ごとにメソッドを呼び出します: UI をフリーズせずに、x=y または経過秒数>=60 のいずれかです。

そこにはいくつかの異なる例があります。私はC#が初めてで、シンプルにしようとしています。私は次のことを思いつきましたが、どこに置くべきかを理解する必要がある最初の10秒間の待機がなく、無限ループがあるようです。これが私のコードです:

  public void StartTimer()
    {

        System.Windows.Threading.DispatcherTimer myDispatchTimer = new System.Windows.Threading.DispatcherTimer();

        myDispatchTimer.Interval = TimeSpan.FromSeconds(10); // initial 10 second wait
        myDispatchTimer.Tick += new EventHandler(Initial_Wait);
        myDispatchTimer.Start();
    }

    void Initial_Wait(object o, EventArgs sender)
    {
        System.Windows.Threading.DispatcherTimer myDispatchTimer = new System.Windows.Threading.DispatcherTimer();
        // Stop the timer, replace the tick handler, and restart with new interval.

        myDispatchTimer.Stop();
        myDispatchTimer.Tick -= new EventHandler(Initial_Wait);
        myDispatchTimer.Interval = TimeSpan.FromSeconds(5); //every x seconds
        myDispatchTimer.Tick += new EventHandler(Each_Tick);
        myDispatchTimer.Start();
    }


    // Counter:
    int i = 0;

    // Ticker
    void Each_Tick(object o, EventArgs sender)
    {


            GetMessageDeliveryStatus(messageID, messageKey);
            textBlock1.Text = "Seconds: " + i++.ToString();


    }
4

1 に答える 1

0

タイマーを変更する 2 番目のイベント ハンドラーを作成します。このような:

public void StartTimer()
{
    System.Windows.Threading.DispatcherTimer myDispatcherTimer = new System.Windows.Threading.DispatcherTimer();

    myDispatchTimer.Interval = TimeSpan.FromSeconds(10); // initial 10 second wait
    myDispatchTimer.Tick += new EventHandler(Initial_Wait);
    myDispatchTimer.Start();
}

void Initial_Wait(object o, EventArgs sender)
{
    // Stop the timer, replace the tick handler, and restart with new interval.
    myDispatchTimer.Stop();
    myDispatchTimer.Tick -= new EventHandler(Initial_Wait);
    myDispatcherTimer.Interval = TimeSpan.FromSeconds(interval); //every x seconds
    myDispatcherTimer.Tick += new EventHandler(Each_Tick);
    myDispatcherTimer.Start();
}

タイマーはInitial_Wait、最初に時を刻むときに呼び出します。そのメソッドはタイマーを停止し、それを にリダイレクトしてEach_Tick、間隔を調整します。後続のすべてのティックは に移動しEach_Tickます。

タイマーを 60 秒後に停止するStopwatch場合は、最初にタイマーを開始するときに を作成し、Elapsedティックごとに値を確認します。このような:

InitialWaitを開始する方法を変更しStopwatchます。クラス スコープ変数が必要です。

private Stopwatch _timerStopwatch;

void Initial_Wait(object o, EventArgs sender)
{
    // changing the timer here
    // Now create the stopwatch
    _timerStopwatch = Stopwatch.StartNew();
    // and then start the timer
    myDispatchTimer.Start();
}

Each_Tickハンドラーで、経過時間を確認します。

if (_timerStopwatch.Elapsed.TotalSeconds >= 60)
{
    myDispatchTimer.Stop();
    myDispatchTimer.Tick -= new EventHandler(Each_Tick);
    return;
}
// otherwise do the regular stuff.
于 2013-01-30T19:20:25.767 に答える