2014-05-03 35 views
-1

增加延遲我使用Windows窗體和DOTNET 3.5如何在沒有了Thread.Sleep幾秒鐘使用C#

我想刪除文件前加2或3秒延遲

//need 2 or 3 second delay here 
File.Delete("d:\testing.txt"); 

我需要延遲只是因爲刪除之前,沒有進行其他操作延遲File.Delete給人異常文件正由另一個進程使用

感謝,

編輯1

我不能整體代碼更大。 先前的操作刪除文件之前是這樣的

System.IO.File.Move(d:\"log.rtf", d:\testing.txt"); 
+4

看起來你的問題更大。介意顯示「整個」代碼? – Kilazur

+2

如果該文件在2秒或3秒後仍被另一個進程使用,該怎麼辦? –

+0

你應該檢查文件是否被另一個進程使用,如果不是,刪除它,如果是,重新運行循環,直到它被釋放或者給出消息。 – Max

回答

1

好像你在正確的軌道,如果你想在這裏使用的延遲不是。

這更是一個線程同步的問題。

最簡單的方法是lock關鍵字。如果您使用lock同步某些代碼,則只有一個線程才能夠輸入受保護的代碼,直到其他代碼釋放鎖定爲止。

例如,如果聲明一個類private readonly object _sync = new object();領域,你改變你的代碼如下...

lock(_sync) 
{ 
    File.Delete(@"d:\testing.txt"); 
} 

...,也是File.Move,之前整個刪除該情況發生,使用鎖反對同樣_sync對象...

lock(_sync) 
{ 
    System.IO.File.Move(@"d:\log.rtf", @"d:\testing.txt"); 
} 

...整個File.Delete會等到File.Move釋放鎖(即lock塊結束)。另一方面,如果我們談論多個進程(不同的應用程序或服務使用同一個文件),則需要Mutex。互斥可以被命名和跨進程共享,它會工作的代碼非常接近上面lock塊(實際上,這是使用Monitor):

您的代碼應該是這樣的:

// Note mutexes must be instantiated using the same name in both processes! 
Mutex mutex = new Mutex(false, "FileMutex"); 

mutex.WaitOne(); 

try 
{ 
    File.Delete(@"d:\testing.txt"); 
} 
finally 
{ 
    mutex.ReleaseMutex(); 
} 

並且...

Mutex mutex = new Mutex(false, "FileMutex"); 
mutex.WaitOne(); 

try 
{ 
    File.Move(@"d:\log.rtf", @"d:\testing.txt"); 
} 
finally 
{ 
    mutex.ReleaseMutex(); 
} 

另請注意.WaitOne(...)有一個接受超時的重載。

瞭解更多有關Mutexon MSDN

+0

不錯,我從來沒有想過這樣的事情甚至存在 –

+1

@UzairAli沒問題,這就是爲什麼像SO這樣的網站是有用的! –