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 を使用して、ライター スレッドにウェイクアップするように通知することもできます。