0

サービスの実行中に作成されたXMLリストを保存したいWCFサービスがあり、サービスが閉じたときにも保存されます。つまり、サービスの再起動時に表示されます。HTTP POSTが呼び出されると、アイテムがリストに追加されます。ただし、サービスの再起動後にリストの項目を返すプログラムのHTTP GETメソッドを呼び出すと、リストの項目は保存されないため表示されません。この問題に関連する私の質問は次のとおりです。

1)後で参照できるように、リストをどのように保存できますか?2)サービスを閉じるたびにこのリストを保存して、サービスの再起動時に表示できるようにするメカニズムはありますか?

もう1つのポインタ:リストアイテムをローカルマシンにxmlファイルとして保存したくありません!

4

1 に答える 1

1

Tim の提案は妥当ですが、それを行うためにカスタム サービス ホストは必要ありません。主なことは、更新後のある時点で、データの内容を永続ストアに書き込むことです。POST を取得したら、メモリ内のデータ表現を更新してから、ファイルシステムの xml ファイルに書き込みます。

  public void DoPost()
  {
      UpdateData();
      SaveDataToFilesystem();
  }

再起動時に、ファイルが存在する場合はそこから読み取ります。

Update()同時実行を処理するには、 メソッドとメソッドでデータをロックする必要がありSave()ます。

システムの負荷が高い場合は、「ファイル filesystem への書き込み」を最大でも 10 秒に 1 回程度に延期します。

  public void DoPost()
  {
      UpdateData();
      QueueWriteToFilesystem();
  }

  private MyInternalDataType data;
  private DateTime lastWrite = new DateTime(1970,1,1); // init value
  private void QueueWriteToFilesystem()
  {
      ThreadPool.QueueUserWorkItem( MaybeWrite );
  }


  private int delayInMilliseconds = 1000 * 10; // 10 seconds
  private void MaybeWrite()
  {
      System.Threading.Thread.Sleep(delayInMilliseconds);
      lock (data)
      {
          var delta = System.DateTime.Now - lastWrite;
          if (delta < new System.TimeSpan(0, 0, 0, 0, delayInMilliseconds))
          {
              // less than 10s since last write
              // do nothing
              return;
          }
          ActuallySaveToFilesystem();
          lastWrite = System.DateTime.Now;
      }
  }

並行性を非常に高くするには、すべてのリクエストで新しいワークアイテムをキューに入れたくありません。代わりに、書き込み専用のスレッドを使用するだけです。

  public void DoPost()
  {
      UpdateData();
      lastUpdate = System.DateTime.Now;
  }

  private void DedicatedWriter()
  {
      do
      {
          System.Threading.Thread.Sleep(delayInMilliseconds);
          lock (data)
          {
              var delta = lastUpdate - lastWrite;
              if (delta < new System.TimeSpan(0, 0, 0, 0, 200))
              {
                  // small amount of time since prior write;
                  // do nothing
                  return;
              }
              ActuallySaveToFilesystem();
              lastWrite = System.DateTime.Now;
          }
      } while (true);
  }

AutoResetEvents を使用して、ライター スレッドにウェイクアップするように通知することもできます。

于 2012-04-26T20:36:41.093 に答える