実行された操作の数と種類を追跡する必要があるアプリケーションを作成しています。すべての操作が完了すると、このデータが API に送信されます。この API はデータを保存し、このデータを使用して、会社はアプリケーションが実行した作業量をユーザーに請求できます。
以下のコードは、私のコードの非常に単純化された実装です。
TicksCounter counter = new TicksCounter();
foreach(var work in workload)
{
//do some work
if(workTypeA)
counter.IncrementTypeA();
else if(workTypB)
counter.IncrementTypeB();
}
ApiClient.PostTicks(counter);
TicksCounter クラスは、クロス スレッド アクセスとその他のいくつかの問題を内部的に処理します。そして、私のコードはそのまま正常に動作しています。
ただし、私の問題はTicksCounter
、アプリケーションがクラッシュした場合や API が利用できない場合に、の内容を保護する良い方法を見つけられないことです。
API が使用できない場合にカウンターの内容を保存する状況を構築したい。それから間隔を置いて、コンテンツを API に投稿し続けようとします。API が再び使用可能になると、これは成功し、このオブジェクトを忘れることができます。アプリケーションがクラッシュした場合、またはユーザーが故意にアプリケーションを終了した場合 (タスクマネージャーを使用してみましょう)、これと同じ状況を適用したいと思います。時間、API に。
これで、アプリケーションの終了時に常に正しいデータを保持するための 100% 信頼できるアプローチは存在しないことがわかりました。ティックの最小限の損失が許可されます。
私の考え
バイナリ シリアル化を使用してハード ドライブ上のファイルにすべての内部コンテンツを保存するコードを TicksCounter クラスに追加することを考えていました。これは、10 の倍数のティックが追加されるたびに発生します。
私の問題は、ハードドライブに保存していて、これを頻繁に行うため、これは非常に高価な操作のように見えることです。多くの重い作業を実行する Windows サービスを実行しているため、最小限のパフォーマンスの低下は問題ではありません。しかし、私はより良い正しい解決策を探しています。
この状況では、どのようなアプローチが適切でしょうか? それとも、私のアプローチに固執する必要がありますか?