0

私はC#、Silverlightで作業しています。

秒単位の値 (または他の時間単位) に基づいてカウントダウンを初期化する方法が必要であり、カウントダウンの最後に何らかの方法を実行する必要があります。

カウントダウンはメイン アプリケーションとは別にする必要があります。

4

4 に答える 4

2

使用する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クラスを使用しないで、はるかに単純なコードで同じレベルの柔軟性を提供します。

于 2012-10-03T16:55:23.027 に答える
1

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 をコントロールに設定すると、これが実現されます。

于 2012-10-03T16:42:01.873 に答える
1

イベント ハンドラーの呼び出し中は、ブロックされるべきではなく、すぐに戻る必要があります。これは、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();
        }
    }
}
于 2012-10-03T16:46:10.977 に答える
1
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();
于 2012-10-03T16:50:19.397 に答える