9

C#で指定された時間にアプリケーションを強制的に閉じるタイマーを作成する方法は? 私はこのようなものを持っています:

void  myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    if (++counter == 120)
        this.Close();
}

ただし、この場合、アプリケーションはタイマーの実行後 120 秒で閉じられます。そして、たとえば 23:00:00 にアプリケーションを閉じるタイマーが必要です。助言がありますか?

4

7 に答える 7

9

修正しなければならない最初の問題は、System.Timers.Timerが機能しないことです。スレッドプールスレッドでElapsedイベントハンドラーを実行します。このようなスレッドは、フォームまたはウィンドウのCloseメソッドを呼び出すことはできません。簡単な回避策は、System.Windows.Forms.TimerまたはDispatcherTimerのいずれかの同期タイマーを使用することです。どちらが適用されるかは、質問からは明らかではありません。

あなたがしなければならない他の唯一のことは、タイマーのIntervalプロパティ値を計算することです。これはかなり単純なDateTime演算です。たとえば、夕方の11時にウィンドウを閉じたい場合は、次のようなコードを記述します。

    public Form1() {
        InitializeComponent();
        DateTime now = DateTime.Now;  // avoid race
        DateTime when = new DateTime(now.Year, now.Month, now.Day, 23, 0, 0);
        if (now > when) when = when.AddDays(1);
        timer1.Interval = (int)((when - now).TotalMilliseconds);
        timer1.Start();
    }
    private void timer1_Tick(object sender, EventArgs e) {
        this.Close();
    }
于 2012-11-29T13:35:57.843 に答える
5

ここで Windows フォームについて話していると思います。次に、これが機能する可能性があります(ここではマルチスレッドタイマーについて話しているため、コードを編集して使用するように変更しました):this.Invoke

void  myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{
    if (DateTime.Now.Hour >= 23)
        this.Invoke((Action)delegate() { Close(); });
}

Windows Forms の使用に切り替えるとTimer、このコードは期待どおりに機能します。

void  myTimer_Elapsed(object sender, EventArgs e) 
{
    if (DateTime.Now.Hour >= 23)
        Close();
}
于 2012-11-29T13:07:35.063 に答える
5

私があなたの要求を理解した場合、次のようなことができるタイマーに毎秒時間をチェックさせるのは少し無駄に思えます:

void Main()
{
    //If the calling context is important (for example in GUI applications)
    //you'd might want to save the Synchronization Context 
    //for example: context = SynchronizationContext.Current 
    //and use if in the lambda below e.g. s => context.Post(s => this.Close(), null)

    var timer = new System.Threading.Timer(
                s => this.Close(), null, CalcMsToHour(23, 00, 00), Timeout.Infinite);
}

int CalcMsToHour(int hour, int minute, int second)
{
    var now = DateTime.Now;
    var due = new DateTime(now.Year, now.Month, now.Day, hour, minute, second);
    if (now > due)
        due.AddDays(1);
    var ms =  (due - now).TotalMilliseconds;
    return (int)ms;
}
于 2012-11-29T13:26:54.290 に答える
3

現在のシステム時刻を取得したい場合があります。次に、現在の時刻がアプリケーションを閉じたい時刻と一致するかどうかを確認します。DateTimeこれは、瞬時を表す which を使用して行うことができます。

public Form1()
{
    InitializeComponent();
    Timer timer1 = new Timer(); //Initialize a new Timer of name timer1
    timer1.Tick += new EventHandler(timer1_Tick); //Link the Tick event with timer1_Tick
    timer1.Start(); //Start the timer
}

private void timer1_Tick(object sender, EventArgs e)
{
    if (DateTime.Now.Hour == 23 && DateTime.Now.Minute == 00 && DateTime.Now.Second == 00) //Continue if the current time is 23:00:00
    {
        Application.Exit(); //Close the whole application
        //this.Close(); //Close this form only
    }
}

ありがとう、
これがお役に立てば幸いです:)

于 2012-11-29T13:12:10.023 に答える
2
Task.Delay(9000).ContinueWith(_ =>
            {
                this.Dispatcher.Invoke((Action)(() =>
                {
                    this.Close();
                }));
            }
            );
于 2016-05-12T04:44:57.847 に答える
2
void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    if (DateTime.Now.Hour >= 23)
    {
        this.Close();
    }
}
于 2012-11-29T13:08:09.773 に答える
0

今のように毎秒チェックするようにタイマーを設定しますが、内容を次のように入れ替えます。

void  myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
  if (DateTime.Now.Hour == 23)
    this.Close();
}

これにより、タイマーが実行され、クロックが 23:xx になると、アプリケーションがシャットダウンされるようになります。

于 2012-11-29T13:07:45.313 に答える