1

実行された操作の数と種類を追跡する必要があるアプリケーションを作成しています。すべての操作が完了すると、このデータが 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 サービスを実行しているため、最小限のパフォーマンスの低下は問題ではありません。しかし、私はより良い正しい解決策を探しています。

この状況では、どのようなアプローチが適切でしょうか? それとも、私のアプローチに固執する必要がありますか?

4

2 に答える 2