ファイルベースの自動インクリメント ID 値 ( int
TXT ファイルに格納された値) を実装しようとしています。同時実行の問題を処理する最善の方法を考え出そうとしています。この ID は、コンテンツの一意の ID として使用されます。新しいコンテンツを保存すると、このファイルが開かれ、値が読み取られ、インクリメントされ、新しいコンテンツが保存され、インクリメントされた値がファイルに書き戻されます (次に使用可能な ID を保存するか、最後に発行された ID を保存するかは問題ではありません)。これが行われている間に、別のプロセスが発生し、新しいコンテンツを保存しようとする場合があります。前のプロセスは でファイルを開くFileShare.None
ため、最初のプロセスによってファイルが解放されるまで、他のプロセスはファイルを読み取ることができません。これが発生する可能性は最小限に抑えられていますが、それでも発生する可能性があります。
これが発生した場合、次の 2 つのオプションがあります。
- ファイルが利用可能になるのを待ちます -
ファイルがロックされているときに C# で File.Open の待機をエミュレートする
ここではミリ秒について話しているので、何か奇妙なことが起こってファイルが利用可能にならない限り、これは問題にならないと思います。この解決策は無限ループになるため、理想的な解決策ではありません
- ある種のキューを実装し、キュー内のファイルに対してすべての操作を実行します。私のユーザー エクスペリエンス要件は、ファイルの保存/変更時に、例外や何か問題が発生したことをユーザーに通知してはならないというものです。後で操作がキューで失敗したときに、非常に使いやすいユーザー インターフェイスを介してユーザーに通知されます。
これを書いている時点では、ソリューションは ASP.NET MVC アプリケーション内で (AJAX を介した同期および非同期の両方で) 機能するはずですが、可能であれば、Silverlight、Windows フォーム、または WPF アプリケーションでも機能する概念を使用する必要があります。
これらの 2 つのオプションに関して、どちらが優れていると思いますか?また、2 番目のオプションの場合、これを実装するためにどのような技術が考えられますか?