私たちは、 "高価な作成"データを読み込んでキャッシュする大量の.Net 3.5アプリケーションを使用しています。アプリケーションは、「別のプロセスで使用されていません」に基づいてファイルを読み取り、書き込みます。他のプロセスがファイルを読み書きしている場合、アプリケーションはスリープ状態に移行してから再試行します。これはファイルを読み書きする正しい方法ですか?お知らせ下さい。ファイルへの書き込みの正しい正しい方法:頻繁に使用されるアプリケーション
public void Add<T>(string key, CacheItem<T> item)
{
bool fileInUse = false;
while (!fileInUse)
{
try
{
using (Stream stream = new FileStream(Path.Combine(cachePath, key+".bin"), FileMode.Create, FileAccess.Write, FileShare.None))
{
Serializer.NonGeneric.Serialize(stream, item);
}
fileInUse = true;
}
catch (IOException ex)
{
if (ex.Message.Contains("being used by another process"))
{
//Poll till the file is free to be used by this process
Thread.Sleep(100);
fileInUse = false;
}
}
}
}
public CacheItem<T> Get<T>(string key, Type type)
{
CacheItem<T> item = null;
FileInfo fileInfo = new FileInfo(Path.Combine(cachePath, key+".bin"));
fileInfo.Refresh();
if (fileInfo.Exists)
{
bool fileInUse = false;
while (!fileInUse)
{
try
{
using (Stream stream = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read, FileShare.None))
{
object objectTemp = Serializer.NonGeneric.Deserialize(type, stream);
item = (CacheItem<T>)objectTemp;
}
fileInUse = true;
}
catch(IOException ex)
{
if (ex.Message.Contains("being used by another process"))
{
//Poll till the file is free to be used by this process
Thread.Sleep(100);
fileInUse = false;
}
}
}
}
return item;
}
上記のコードに必要な変更を加えてもよろしいですか? – Pankaj
@PankajGarg私はできると確信していますが、それは何を達成するでしょうか?この仕組みがどのように機能するのか不明な点はありますか? –
Branko; は、ここに私たちの建築家の一人は=>述べ何である「私はミューテックスクラスを使用して持って予約をそれが私たちのパフォーマンスの向上の目的を破っロックステートメントを使用するか、クラスを監視するよりも計算に高価であるということです。」何かご意見は? –