2012-12-04 20 views
6

Başım ağrıyor olan aşağıdaki kod bloğum var.FileStream okuma ve yazma için bir dosya kilitleme C#

Mantıksal olarak, kullanım bildirimi içinde kilidi sağlayan filestriyi kullanıyorum. StreamWriter'i oluşturan çizgiye geldiğinde, "dosya yazılabilir değil" diyerek başarısız olur.

Şimdi programım çok iş parçacıklı bir uygulamadır. Herhangi bir iş parçacığı bu dosyaya yazmaya çalışıyor olabilir. Dosyayı kilitlemek, içeriği okumak, içeriği kontrol etmek ve sonra herhangi bir değişiklik yapmak için programa ihtiyacım var. Bu işlem sırasında, başka bir iş parçacığı bu dosyaya erişebilmelidir.

using (var fs = File.Open(fileLoc, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) 
{ 
    var sr = new StreamReader(fs); 
    var str = sr.ReadToEnd(); 
    var strArray = str.Split(','); 
    if (strArray.Any(st => st == text)) 
    { 
     return; 
    } 
    sr.Close(); 

    var sw = new StreamWriter(fs); 
    sw.Write(str + text); 
    sw.Flush(); 
    sw.Close(); 
} 

cevap

6

FileShare.None bayrak sadece dosya elde edersiniz dolayısıyla istisna kilitler, ipler Sıraya neden olmaz. Karşılıklı erişim sağlamak için, yazmadan önce paylaşılan bir nesneyi kilitleyebilirsiniz.

Ama şunu söylüyorsunuz: "Şimdi programım çok iş parçacıklı bir uygulama. Herhangi bir iş parçacığı bu dosyaya yazmaya çalışıyor olabilir." Şimdi, bu iş parçacığı dosyaya yazmak için tamamen aynı yöntemi kullanın?

lock (lockObject) 
{ 
    var sw = new StreamWriter(fs); 
    sw.Write(str + text); 
    sw.Flush(); 
    sw.Close(); 
} 

Bazı varsayımlar hakkında yapmış ...

private static object lockObject = new object(); 

buradan kullanın ...

statik sınıf değişkeni oluşturun ... Hadi onlar, o zaman bu çalışması gerekir do varsayalım iş parçacığı, bu yüzden eğer bu işe yaramıyorsa veya bize daha fazla bilgi verince senkronizasyon hakkında bilgi aramak zorunda kalabilirsiniz.

Ayrıca, lütfen StreamReader'ınızı daha önce kapatın (yöntem daha erken döndüğünde). Kullandıktan sonra hemen kapatın.