業務案例:Web服務:只允許一個線程在同一時間執行
我有一些遠程目錄ASMX web service
是拷貝/刪除/下載文件。我的WebMethod
創建了執行所有這些操作的業務類的實例。在下載的情況下,我檢查哪個文件是最新的文件並下載它。一旦下載,我想立即刪除它。但是,在多線程場景中,很可能我嘗試刪除的文件已被其他某個線程刪除。
我的解決辦法:
爲了避免這樣的問題,我想Web服務在同一時間只能執行一個線程。對WebMethod
的任何其他調用應等待,直到前一個線程完成下載和刪除操作。
爲此,我在商務艙中聲明瞭一個static
變量。在業務類別的業務方法開始時(從WebMethod
調用),我在此靜態對象上調用lock
。因此,在該靜態變量(對象)上的lock
未發佈之前,其他Web服務調用將不會執行業務方法中的代碼。
public class FileOperator
{
private static object locker = new object();
public void DownloadAndDeleteFile(string fileName)
{
lock(locker)
{
// All business logic goes here.
}
}
}
WebMethod
中的代碼看起來像這樣。
FileOperator fileOperator = new FileOperator();
fileOperator.DownloadAndDeleteFile("File1.txt");
問題:
- 是我的解決方案是否正確?
- 如果是,如何只允許一個線程從web服務內執行?請注意,我只想爲此下載..上傳應該在並行線程中工作..
- 任何更好的解決方案?
我正在使用.NET 4.0。
在實時這將是來電一些遠程FTP服務器,這將是相當繁重的操作。此外,讓我們說上面的代碼給了我文件ABC存在的結果,所以我嘗試刪除它,但其他一些線程可能已經刪除它,然後再發出刪除請求。整個要求有許多失敗點。例如。一個線程決定哪個是目錄中的最新文件併發出下載請求。但其他一些線程可能在此時刪除它!所以我試圖避免任何第二線程的干擾! – Learner 2012-07-23 10:28:44
這就是爲什麼在存在檢查和刪除周圍存在監視器鎖定的原因。文件可能被刪除有不同的地方嗎? – Fragilerus 2012-07-23 12:02:58