C#、. NET 4.0アップデート4.0.3、Windows 7 64ビットを使用:
私の責任を超えた理由で、バックグラウンドでメッセージを処理している間、GUIスレッドを「スリープ」させる必要があります。これまで、これは問題なく機能しました。
private void SleepWithEventLoop(int ms)
{
var timeout = DateTime.UtcNow.AddMilliseconds(ms);
while (DateTime.UtcNow < timeout && !disposed)
{
System.Windows.Forms.Application.DoEvents();
Thread.Sleep(1);
}
}
今朝PCを起動したので、明らかな理由もなく、次のような例外が発生し始めます(ログファイルからの抜粋)。
2012-12-18 12:50:41.204 | - None - | Exception | Exception caught: Der hinzuzufügende Wert war außerhalb des Bereichs.
| | | Parametername: value
| | | Details:
| | | bei System.DateTime.Add(Double value, Int32 scale)
| | | bei System.DateTime.AddMilliseconds(Double value)
| | | bei com.<...>.CanOpenProxyServer.SleepWithEventLoop(Int32 ms) in C:\Users\<...>\CanOpenProxy.cs:Zeile 78.
| | | bei com.<...>.CanOpenProxyServer.HandleConnection(MessageChannel channel) in C:\Users\<...>\CanOpenProxy.cs:Zeile 55.
DateTime.UtcNowに切り替えた後に消えたDSTに関して、DateTime.Nowにいくつか問題がありましたが、上記の例外が残っています。IT部門は最近アップデートをインストールしませんでした、そして私は確かにプログラムをインストールまたは削除したり、レジストリを混乱させたりしませんでした。どうしてDateTimeが突然「壊れて」しまうのでしょうか?!?
上記のコードを新しいプロジェクトにコピーして、単独でテストしました
while (true) SleepWithEventLoop(5);
それでもクラッシュしました。.NETの再インストールも機能しませんでした。何か案は?
編集:2人の同僚のPCで同じ問題が発生しましたが、新しくインストールしたVmWareシステムでは問題が発生しませんでした。弊社のPCが少しおかしな構成になっているように見え始めます。DateTimeには「特別な」構成が必要ですか?
編集2:そこで、DateTimeのようなクラスにラップされたtime.h関数を公開する小さなC DLLにP-Invokingすることで、問題を「修正」しました。すべてのプロジェクトで検索/置換します。これを行うと汚く感じますが、少なくとも症状は解決します。スケジュールのストレスが少し減ったら、もう一度調べます(ええ、そうです)。