おそらく、このカウントダウンを取得するために、ディスプレイを毎秒更新したいと思いますか? しかし、私が理解した場合、何らかの理由ですべてを 3 秒遅らせたいと考えています。
現在起こっていることよりも 3 秒遅れて物事が起こるようにしたい場合、明白な解決策は、タイマーをプログラムして、実際にやりたいときに電話をかけることです。
private DispatcherTimer t = new DispatcherTimer();
private int Counter = 120;
public MainPage()
{
InitializeComponent();
t.Interval = TimeSpan.FromSeconds(4);
t.Tick += timer_Tick;
t.Start();
}
private void timer_Tick(object sender, object o)
{
t.Interval = TimeSpan.FromSeconds(1);
Time.Text = string.Format("{0}:{1}", (Counter / 60), (Counter % 60).ToString().PadLeft(2, ' '));
Counter--;
}
これにより、最初のティックが到着するまでに 4 秒かかり、間隔が 1 秒に調整されます。したがって、ティックは 1 秒間隔で取得されますが、すべてがそうでない場合よりも 3 秒遅れて発生します。(ティック間隔を最初に 1 に設定すると、最初のティックが到着するまでに 1 秒かかります。これが、最初に 4 秒の遅延が必要な理由です。最初のティックが 3 の場合、遅延は 2 秒にすぎません。)
ただし、いくつかのことをすぐに行う必要があり、いくつかのことを遅らせる必要がある場合、それを行うための明白な方法の 1 つは、ハンドラーのカウントを 3 秒だけ調整することです。
private const int LevelMaxTime = 120;
private DispatcherTimer t = new DispatcherTimer();
private int Counter = LevelMaxTime;
public MainPage()
{
InitializeComponent();
t.Interval = TimeSpan.FromSeconds(1);
t.Tick += timer_Tick;
t.Start();
}
private void timer_Tick(object sender, object o)
{
// Do the undelayed work here, whatever that is...
// Next, we do the delayed work, if there is any yet.
int effectiveCount = Counter + 3;
if (effectiveCount <= LevelMaxTime)
{
Time.Text = string.Format("{0}:{1}", (effectiveCount / 60), (effectiveCount % 60).ToString().PadLeft(2, ' '));
}
Counter--;
}
これは、有効な現在の時間が実際の時間の 3 秒前になるCurrent
ため、すべてが 3 秒遅れます。
元のコードにもっと似たことができます:
private async void timer_Tick(object sender, object o)
{
// Wait for 3 seconds...for some reason
await Task.Delay(TimeSpan.FromSeconds(3));
Time.Text = string.Format("{0}:{1}", (Counter / 60), (Counter % 60).ToString().PadLeft(2, ' '));
Counter--;
}
それはあなたが書いたものに精神的に近いです(私が知る限り)、それは機能しますが、不必要に複雑に見えます. 間違った時間にコールバックを取得して補正しようとするのではなく、適切な時間に電話をかけるようにタイマーをプログラムしてみませんか? タイマーです。話しかけると電話がかかってきます!