2005年05月30日
川俣晶の縁側ソフトウェア技術雑記total 9436 count

これは致命傷か!? Windows Server 2003 SP1上において、System.Threading.Timerクラスのタイマーが停止する問題

Written By: 川俣 晶連絡先

概要 §

 Windows Server 2003 Service Pack 1上において、.NET Framework 1.1のSystem.Threading.Timerクラスのタイマーが停止する現象が起こるようです。

 事実であれば、極めて致命的な問題と言うことができます。

環境 §

 問題が発生する環境は、こちらの経験と、検索して発見したいくつかのページから、Windows Server 2003 SP1上の.NET Framework 1.1、ということで良いようです。

 完全に確定されていませんが、こちらではWindows Server 2003にService Pack 1を当ててから現象が起こるようになったという印象があります。

現象 §

 System.Threading.Timerクラスのタイマーを用いて、ハンドラメソッドを呼び出すように設定しているにも関わらず、それが呼び出されないことがあります。(詳細は下記検証ソース参照)

 不明の条件により、数時間ごとに頻発する場合と、たまにしか発生しない場合があります。

参考情報 §

 以下のページが、同じ問題を述べている可能性があります。

検証プログラム §

 問題切り分けのために、最低限のコードだけに限定した検証プログラムを作成しました。

 Visual Studio.NET 2003によって作成されたC#のASP.NET アプリケーションです。

 これを動作させ、ボタンのクリックを続けていると、「カウント」と「経過時間」の双方の値が増えていきます。しかし、あるタイミングから、「経過時間」の値が増えていくのに、「カウント」の値が変化しなくなります。

 同じプログラムをWindows XP SP2上で実行した場合、このような問題は発生しません。

 以下はその段階に達した時のスクリーンショットです。

スクリーンショット1

スクリーンショット2

スクリーンショット3

 ソースコードは以下の通りです。

 Visual Studio.NET 2003でC#のASP.NET アプリケーションのプロジェクトを作成後、フォーム上にボタン1つとラベル2つを貼り付けます。ボタンはButtonRefreshと名前を変えておきます。あとは以下のコードの不足部分を追記して実行します。

 ASP.NETですから、長時間操作せず放置すると、自動的に停止させられてしまうので注意してください。

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

using System.Threading;

namespace ThreadTimerChecker001

{

    /// <summary>

    /// WebForm1 の概要の説明です。

    /// </summary>

    public class WebForm1 : System.Web.UI.Page

    {

        protected System.Web.UI.WebControls.Button ButtonRefresh;

    

        private void Page_Load(object sender, System.EventArgs e)

        {

            // ページを初期化するユーザー コードをここに挿入します。

        }

        #region Web フォーム デザイナで生成されたコード 

         //(略)

        private void ButtonRefresh_Click(

                                     object sender, System.EventArgs e)

        {

            TimeSpan span = DateTime.Now.Subtract(countFrom);

            Label1.Text = "カウント: " + counter.ToString();

            Label2.Text = "経過時間: " + span.TotalSeconds.ToString();

        }

        private static readonly TimeSpan delayedToStartSpan =

                                      TimeSpan.FromSeconds(1.0);

        private static readonly TimeSpan intervalSpan =

                                TimeSpan.FromMilliseconds(-1.0);

        private static readonly Timer timer = new Timer( 

            new TimerCallback( timerHandler ),

            null, delayedToStartSpan, intervalSpan );

        private static int counter = 0;

        protected System.Web.UI.WebControls.Label Label1;

        protected System.Web.UI.WebControls.Label Label2;

        private static DateTime countFrom = DateTime.Now;

        private static void timerHandler(object dummy)

        {

            counter ++;

            timer.Change( delayedToStartSpan, intervalSpan );

        }

    }

}

Facebook

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20050530154419
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.