1

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することで、問題を「修正」しました。すべてのプロジェクトで検索/置換します。これを行うと汚く感じますが、少なくとも症状は解決します。スケジュールのストレスが少し減ったら、もう一度調べます(ええ、そうです)。

4

1 に答える 1

0

1台のコンピューターで正しく機能し、2台目のコンピューターで正しく機能しないコードがある場合、問題はアプリケーションで使用されているDLLにあると思います。だから私の推薦はこれです:

  • マシンとそれが動作するVMの両方でアプリを実行します。
  • 両方のマシンでProcessExplorerを実行します。
  • ProcessExplorerの下部ペインにDLLを表示します。
  • DLLのバージョンを比較して、異なる場合はどれかを確認します。
于 2012-12-18T15:40:19.727 に答える