ASP.NET で Web アプリケーション上やコンソール アプリケーションの複数スレッドで同時に DateTime.Parse を処理すると、FormatException が発生することがある

適用対象: Microsoft Windows Server 2003 Datacenter Edition (32-bit x86)Microsoft Windows Server 2003 Datacenter x64 EditionMicrosoft Windows Server 2003 Enterprise x64 Edition

現象


Microsoft ASP.NET で Web アプリケーション上やコンソール アプリケーションの複数スレッドで同時に、DateTime.Parse を処理すると、まれに FormatException が発生し以下のエラーメッセージが表示されることがあります。

また、この現象は、コンソールやサービス アプリケーションが複数スレッドで DateTime.Parse を使っている場合にも発生する場合があります。

Exception: System.FormatException はハンドルされませんでした。
Message: "文字列は有効な DateTime ではありませんでした。"
StackTrace:
場所 System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)

場所 System.DateTime.Parse(String s)

場所 ... (呼び出し元のコールスタック)

原因


DateTime.Parse 内部関数で利用する DateTimeFormatInfo オブジェクトに .NET Framework 内部処理で不正な値が入力されることにより DateTime.Parse メソッドの変換処理で FormatException が発生します。DateTimeFormatInfo はワーカープロセス起動時に初期化されますが、何らかの理由により初期化が失敗すると、本現象が発生します。

解決方法


Windows Server 2003 環境の場合は、以下の修正プログラムをインストールすることで問題を解決することが可能です。

修正プログラムについては、次のサポート技術情報を参照してください。

注 : この修正プログラムをインストールする際には、Windows Server 2003 SP2 がインストールされている必要があります。

2404988 DateTime.Parse メソッドを処理する時に、System.FormatException エラーが発生する場合がある

回避策


修正プログラムを適用せずに、この問題を回避するには、以下のいずれかの方法を実行してください。

方法 1 : 明示的にカルチャを指定する

文字列から DateTime 構造体へ Parse メソッドを使って変換する際に明示的にスレッドのカルチャを指定して以下のようにコードを記入ください。

DateTime dt = DateTime.Parse("2008/06/11 14:00:28",
 new CultureInfo(Thread.CurrentThread.CurrentCulture.Name));

方法 2 : Application_Start イベントでワーカープロセス起動時にダミーメソッドで DateTimeFormatInfo の内部変数初期化を強制的に行う

Application_Start イベント内部に以下のコードを記入ください。指定する日付の文字列は有効な日付である必要があります。

DateTime dt = DateTime.Parse("2008/06/11 14:00:28");