17

私は次のように初期化したDispatcherTimerを持っています:

static DispatcherTimer _timer = new DispatcherTimer();

static void Main()
{
    _timer.Interval = new TimeSpan(0, 0, 5);
    _timer.Tick += new EventHandler(_timer_Tick);
    _timer.Start();
}
static void _timer_Tick(object sender, EventArgs e)
{
    //do something
}

_timer_Tickイベントが発生することはありませんが、何か見落としたことはありますか?

4

6 に答える 6

34

これがメインのエントリポイントである場合、最初のイベントが発生するMain前にメソッドが終了する可能性があります(ほぼ確実です)。DispatcherTimer

メインが終了するとすぐに、他のフォアグラウンドスレッドがないため、プロセスはシャットダウンします。

そうは言っても、DispatcherTimer実際にはDispatcher、WPFやSilverlightアプリケーションなどのユースケースでのみ意味があります。コンソールモードアプリケーションの場合、Timerクラスの使用を検討する必要があります。

static System.Timers.Timer _timer = new System.Timers.Timer();

static void Main()
{
    _timer.Interval = 5000;
    _timer.Elapsed  += _timer_Tick;
    _timer.Enabled = true;

    Console.WriteLine("Press any key to exit...");
    Console.ReadKey(); // Block until you hit a key to prevent shutdown
}
static void _timer_Tick(object sender, ElapsedEventArgs e)
{
    Console.WriteLine("Timer Elapsed!");
}
于 2011-03-22T15:45:02.390 に答える
6

ティックが呼び出される前にメインメソッドスレッドが終了したためです。

于 2011-03-22T15:45:06.697 に答える
5

Application.Run()を見逃しました。ティックイベントは、ディスパッチャループなしではディスパッチできません。二次的な問題は、イベントが発生する前にプログラムがすぐに終了することです。Application.Run()もそれを解決し、Main()メソッドをブロックします。

于 2011-03-22T15:45:17.333 に答える
1

ディスパッチャがイベントを「実行」するには、ディスパッチャを起動する必要があります。WPFアプリケーション内で実行している場合、これは自動的に行われます。コンソール(のように見えます)で実行している場合、ディスパッチャがないため、これは起動しません。あなたができる最も簡単なことは、WPFアプリケーションでこれを試すことであり、それはうまくいくはずです。

于 2011-03-22T15:47:18.053 に答える
1

タイマーがワーカースレッドで作成されている場合、Tickディスパッチャーがないため、イベントは発生しません。

UIスレッドでタイマーを作成するかDispatcherTimer、インスタンスを2番目の引数として受け取るコンストラクターを使用しDispatcherて、UIディスパッチャーを渡す必要があります。

var timer = new DispatcherTimer(DispatcherPriority.Background, uiDispatcher);
于 2021-08-13T16:15:59.153 に答える
-3

あなたは使用する必要があります

static void DispatcherTimer_Tick(object sender, object e)
{

}

timer_tickイベントの代わりに

于 2015-11-17T18:17:14.600 に答える