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 アプリケーションのプロジェクトを作成後、フォーム上にボタン1つとラベル2つを貼り付けます。ボタンはButtonRefreshと名前を変えておきます。あとは以下のコードの不足部分を追記して実行します。
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 );
}
}
}