6

私は通常の方法でフォームを開始します。

Application.Run(new MainForm());

一定時間開いてから閉じてほしい。私は以下を試しましたが、役に立ちませんでした:

(1)Mainメソッド(Application.Run()ステートメントの場合)に、次のAFTER Application.Run()を入力します。

while (DateTime.Now < Configs.EndService) { }

結果:ヒットすることはありません。

(2)Application.Run()の前に新しいバックグラウンドスレッドを開始します。

        var thread = new Thread(() => EndServiceThread()) { IsBackground = true };
        thread.Start();

EndServiceThreadは次のとおりです。

    public static void EndServiceThread()
    {
        while (DateTime.Now < Configs.EndService) { }
        Environment.Exit(0);
    }

結果:vshost32.exeがクラッシュの動作を停止しました。

(3)MainForm Tickイベントの場合:

        if (DateTime.Now > Configs.EndService)
        {
            this.Close();
            //Environment.Exit(0);
        }

結果:vshost32.exeがクラッシュの動作を停止しました。

私の目標を達成するための適切な方法は何ですか?繰り返しになりますが、フォームを起動し、特定の時間(Configs.EndService)まで開いて実行してから、閉じます。

ありがとう、ベン。

4

4 に答える 4

5

タイマーを作成し、イベントハンドラーでプログラムを閉じます。

10分後にアプリケーションをシャットダウンしたいとします。60,000ミリ秒の周期でタイマーを初期化します。イベントハンドラは次のようになります。

void TimerTick(object sender)
{
    this.Close();
}

特定の日時に終了させたい場合は、タイマーを1秒に1回チェックDateTime.Nowして、希望の終了時刻と照合することができます。

TimerTickはUIスレッドで実行されるため、これは機能します。別のスレッドのアイデアの問題は、UIスレッドではなくForm.Close、バックグラウンドスレッドで呼び出されたことです。それは例外をスローします。UI要素を操作するときは、UIスレッド上にある必要があります。

Form.Invokeを実行するために呼び出した場合、バックグラウンドスレッドのアイデアはおそらく機能しますClose

WaitableTimerオブジェクトを作成して、そのイベントを特定の時間に設定することもできます。フレームワークにはがありませんが、WaitableTimer使用できます。C#を使用した.NETの待機可能タイマーの記事を参照してください。コードはhttp://www.mischel.com/pubs/waitabletimer.zipで入手できます。

を使用する場合WaitableTimer、コールバックはバックグラウンドスレッドで実行されることに注意してください。InvokeUIスレッドと同期する必要があります。

this.Invoke((MethodInvoker) delegate { this.Close(); });
于 2013-03-19T03:21:33.237 に答える
4

このようなものはどうですか:

public partial class Form1 : Form
{
    private static Timer _timer = new Timer();

    public Form1()
    {
        InitializeComponent();
        _timer.Tick += _timer_Tick;
        _timer.Interval = 5000; // 5 seconds
        _timer.Start();            
    }

    void _timer_Tick(object sender, EventArgs e)
    {
        // Exit the App here ....
        Application.Exit();
    }
}
于 2013-03-19T03:34:53.227 に答える
0

「ServiceEnded」イベントはありますか?はいの場合は、サービスが終了したときにフォームを閉じます。

于 2013-03-19T03:31:55.883 に答える
0

を使用する場合は、を使用して、アプリケーションを閉じたい時間として最初に起動する時間を設定System.Threading.Timerできます。DueTime

new System.Threading.Timer((o) => Application.Exit(), null, (Configs.EndService - DateTime.Now), TimeSpan.FromSeconds(0));
Application.Run(new Form1());
于 2013-03-19T03:39:14.923 に答える