【C#】スレッドアプリケーションを作成するために(ループについて)

■ はじめに

http://www.clks.jp/csg/gt001.html
に面白い技術があったのでメモ。

■ 周辺技術

Forms.Application.DoEvents()

アプリケーションのメッセージ・キューにたまったすべてのWindowsメッセージを処理するためのもの
補足
すべてのWindowsメッセージを処理でき、処理中にデータ削除などを行うことができ、動作不整合が発生する可能性がある。
そのため、DoEventsメソッドを呼び出す前に、ボタンを無効化するなど、何らかの対処を行っておく必要がある。
参考文献
http://dobon.net/vb/dotnet/vb6/doevents.html
http://www.atmarkit.co.jp/fdotnet/dotnettips/136doevents/doevents.html

Environment.TickCount プロパティ

http://msdn.microsoft.com/ja-jp/library/system.environment.tickcount.aspx
システム起動後のミリ秒単位の経過時間を取得
補足
TickCount は、Int32.MaxValue (約 24.9 日) までインクリメントされた後、一旦、Int32.MinValue (負数) になり、再び、ゼロに戻ってから、 24.9 日までインクリメントされる(のでオーバーフローしない)

Form.Created プロパティ

true:フォームが生成されている
false:フォームが消された

■ サンプル

例1:ボタン押下後にループを行う

private const int IintervalTime = 1000;

private void button1_Click(object sender, EventArgs e)
{
    var time = 0;
    var oldTime = Environment.TickCount;
    
    while (true)
    {
        time++;
        if (oldTime + IintervalTime <= Environment.TickCount)
        {
            this.label1.Text = string.Format("Time : {0}", time.ToString());
            oldTime = Environment.TickCount;
            time = 0;
        }
        Application.DoEvents();
    }
}

例2

private const int IintervalTime = 1000;

static void Main()
{
    Form1 form = new Form1();
    form.Show();

    var time = 0;
    var oldTime = Environment.TickCount;

    while (form.Created)
    {
        time++;
        if (oldTime + IintervalTime <= Environment.TickCount)
        {
            form.label1.Text = string.Format("Time : {0}", time.ToString());
            oldTime = Environment.TickCount;
            time = 0;
        }
        Application.DoEvents();
    }
}