2008-09-18 65 views
6

在一個asp.net web應用程序中,我想寫入一個文件。該功能將首先從數據庫中獲取數據,然後寫出平面文件。想寫入一個文件,但一次可能有多個寫入者,需要鎖定

我該怎麼做才能確保只發生1次寫入,一旦發生寫入,寫入之後可能要寫入文件的其他線程就不會發生。

我想只在15分鐘內完成這個寫操作。

我知道有一個鎖關鍵字,所以我應該將所有內容都包含在一個鎖中,然後檢查它是否已在15分鐘或更長時間內更新,或者反之亦然?

更新

工作流程:

因爲這是一個Web應用程序,多個實例將是人查看特定網頁。我可以使用緩存系統中的構建,但是如果asp.net重新使用,重建緩存將會很昂貴,所以我只想將其寫入一個平面文件。我的其他選擇只是創建一個Windows服務,但這是更多的工作來管理我想要的。

+0

所有的寫入是在單個應用程序的單個實例中發生的嗎?或者,應用程序的多個實例會試圖同時寫入,還是會嘗試同時寫入不同的應用程序? – 2008-09-18 15:34:12

回答

2

同步您的寫入代碼以鎖定共享對象,以便只有一個線程進入該塊。其他人等到現在的人退出。

lock(this) 
{ 
    // perform the write. 
} 

更新:我假設你有一個共享對象。如果這些在同一臺機器上是不同的進程,你需要類似命名互斥體的東西。 Looky here for an example

+0

我認爲這是行不通的,因爲我在下面解釋過。 – MarkR 2008-09-18 15:36:36

1

是不是更好地鎖定一個對象變量而不是整個實例?

0

我不相信.NET的鎖定適用於不同的進程。而且,lock(this)只會排除在同一個「this」實例上運行該方法的其他線程 - 所以即使在同一進程中的其他線程也可以在不同的實例上一次運行。

假設你所有的進程都在同一臺機器上運行,文件鎖定應該這樣做。如果你在不同的機器上,你的里程可能會有所不同,win32聲稱有文件鎖定在網絡上工作,但歷史上依賴它的應用程序(Think MSAccess)無論如何都有文件損壞的問題。

+0

你說得對,爲了鎖的工作,你需要所有的方法來使用「this」的同一個實例。這裏的解決方案可能是創建一個** static ** dummy對象實例,它將確保。 – 2012-01-21 18:09:45

0
// try enter will return false if another thread owns the lock 
    if (Monitor.TryEnter(lockObj)) 
    { 
     try 
     { 
     // check last write time here, return if too soon; otherwise, write 
     } 
     finally 
     { 
     Monitor.Exit(lockobj); 
     } 
    } 
+0

這與lock(lockObj){}完全相同。 – 2008-10-04 15:34:34

1

寫入文件的文件I/O操作會自動鎖定文件。檢查文件是否被鎖定(通過嘗試寫入),如果不寫入。在做任何寫操作之前,檢查文件的時間戳,看看它是否超過15分鐘。

afaik您不能寫入文件,而不會被Windows鎖定/不管。

現在,所有剩下的事情就是查找如何使用msdn來完成上述操作(對不起,我不能費心去查看它,並且我不記得C#類很好)。 :)

+1

請注意,我的答案取決於時間戳是可靠的 - 並不總是一個好的假設。您可以在任何過程完成寫入之後,將文件保持打開狀態,僅寫入15分鐘。 :) – jheriko 2012-03-19 03:59:35

0

使用的文件系統鎖定

與其他人一樣建議。在這種情況下,NET鎖的使用將受到限制。 下面是代碼:

FileInfo fi = new FileInfo(path); 
if (fi.Exists 
    && (DateTime.UtcNow - fi.LastWriteTimeUtc < TimeSpan.FromMinutes(15)) { 
    // file is fresh 
    return; 
} 

FileStream fs; 
try { 
    fs = new FileStream(
    path, FileMode.Create, FileAccess.Write, FileShare.Read); 
} catch (IOException) { 
    // file is locked 
    return; 
} 

using (fs) { 
    // write to file 
} 

這將跨線程處理工作。

0

你們應該考慮一個Mutex。它可以在多個線程和進程之間進行同步。

相關問題