私はC#、Silverlightで作業しています。
秒単位の値 (または他の時間単位) に基づいてカウントダウンを初期化する方法が必要であり、カウントダウンの最後に何らかの方法を実行する必要があります。
カウントダウンはメイン アプリケーションとは別にする必要があります。
私はC#、Silverlightで作業しています。
秒単位の値 (または他の時間単位) に基づいてカウントダウンを初期化する方法が必要であり、カウントダウンの最後に何らかの方法を実行する必要があります。
カウントダウンはメイン アプリケーションとは別にする必要があります。
使用するTask.Delay
static void SomeMethod()
{
Console.WriteLine("Thread ID = " + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("performing an action...");
}
static void Main(string[] args)
{
int someValueInSeconds = 5;
Console.WriteLine("Thread ID = " + Thread.CurrentThread.ManagedThreadId);
Task.Delay(TimeSpan.FromSeconds(someValueInSeconds)).ContinueWith(t => SomeMethod());
// Prevents the app from terminating before the task above completes
Console.WriteLine("Countdown launched. Press a key to exit.");
Console.ReadKey();
}
気になるコード行は、Task.Delay
. アクションがカウントダウン後に実行されることを示すために、他のすべてを含めました。
新しい Task.* API であるTimerクラスを使用しないで、はるかに単純なコードで同じレベルの柔軟性を提供します。
System.Timers.Timer オブジェクトを使用します。Elapsed イベントをサブスクライブしてから、Start を呼び出します。
using System.Timers;
...
some method {
...
Timer t = new Timer(duration);
t.Elapsed += new ElapsedEventHandler(handlerMethod);
t.AutoReset = false;
t.Start();
...
}
void handlerMethod(Object sender, ElapsedEventArgs e)
{
...
}
デフォルトでは (上記のように)、Timer はThreadPool
イベントのトリガーに使用されます。これは、handlerMethod がアプリケーションと同じスレッドで実行されないことを意味します。ThreadPool 内の他のスレッドとは競合する可能性がありますが、プール外のスレッドと競合することはありません。SynchronizingObject を設定して、この動作を変更できます。特に、Elapsed イベントが Windows フォーム コントロールのメソッドを呼び出す場合、コントロールを作成したのと同じスレッドで実行する必要があります。SynchronizingObject をコントロールに設定すると、これが実現されます。
イベント ハンドラーの呼び出し中は、ブロックされるべきではなく、すぐに戻る必要があります。これは、Timer、BackgroundWorker、または Thread によって (この優先順位で) 実装する必要があります。
参照:
using System;
using System.Windows.Forms;
class MyForm : Form {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.Run(new MyForm());
}
Timer timer;
MyForm() {
timer = new Timer();
count = 10;
timer.Interval = 1000;
timer.Tick += timer_Tick;
timer.Start();
}
protected override void Dispose(bool disposing) {
if (disposing) {
timer.Dispose();
}
base.Dispose(disposing);
}
int count;
void timer_Tick(object sender, EventArgs e) {
Text = "Wait for " + count + " seconds...";
count--;
if (count == 0)
{
timer.Stop();
}
}
}
DispatcherTimer timer = new DispatcherTimer();
timer.Tick += delegate(object s, EventArgs args)
{
timer.Stop();
// do your work here
};
// 300 ms timer
timer.Interval = new TimeSpan(0, 0, 0, 0, 300);
timer.Start();