1

オブジェクトを1分ごとにxmlファイルにシリアル化するタイマー関数があります。しばらくは動作しますが、約38時間後、以下のIO例外が発生します。ここに画像の説明を入力してください

スクリーンショットでわかるように、ディレクトリがそこにあることがわかります。また、この問題が発生した場合は、dosに次のコマンドを入力することもできます。echo "test"> test.xmlを使用すると、その正確なディレクトリ位置にtest.xmlファイルを作成できます。

私のコードは次のとおりです。

try
  {
    if (!Directory.Exists(filePath))
      this.log.Write(LogLevel.Fatal, this.componentName, "Directory not exists: " + filePath);


     lock (lockObject)
        {
          filepath = filepath + "ApplicationState.xml";
          if (File.Exists(filePath))
             File.Delete(filePath);

          if (this.StateObject != null && !File.Exists(filePath))
          {
             using (Stream sWrite = File.Create(filePath))
             {
                this.Serializer = new XmlSerializer(typeof(State));
                this.Serializer.Serialize(sWrite, this.StateObject);
             }
           }
        }
     }catch (Exception ex)
     {
        if (this.log != null)
        {
           this.log.Write(ex, this.componentName);
        }
     }
     finally
     {
        if (this.StreamWriter != null)
        {
             this.StreamWriter.Close();
        }
        bRun = true;

      }

私は最善を尽くしてコードを調べて、ぶら下がっているIOリソースがないことを確認しようとしましたが、この時点で正直に言うとかなり途方に暮れています...ウィンドウCEまたはC#には何らかの種類のロックリソースがありますか?ファイルを開いて読み取るために使用するもの以外の一般的なIO?

4

1 に答える 1

4

「\Hard Disk」と呼ばれるものに書き込んでいることがわかりました。これは、永続的なストレージ ボリューム (オンボード フラッシュ、USB ディスク、CF カードなど) に書き込んでいる可能性が高いと思われます。これらの周辺機器には、OS の一部として Microsoft ではなく、デバイスの OEM によって提供されるデバイス ドライバーと、おそらくいくつかの割り込みハンドラーが必要であることに注意してください。

ドライバー チェーンのどこかにバグがあり、それが問題を引き起こしている可能性は常にあります。同時実行ロックの失敗のような匂いがします。組み込み OS を使用する場合は、目にする障害が常に自分のコードであると想定しないでください。OEM のコードには簡単にバグが含まれる可能性があります。

私はこれを2つの方法で攻撃します:

  1. 問題を OEM に報告し、OEM が再現/修正できるかどうかを確認します。
  2. 回避策としてこの問題を探して処理するために、独自のコードに再試行ロジックを追加してみてください。
于 2012-09-10T18:08:16.467 に答える