如何使用c#在没有thread.sleep的情况下添加延迟几秒钟

时间:2014-05-03 18:03:24

标签: c# winforms

我正在使用Windows表单和dotnet 3.5

我想在删除文件之前添加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");

1 个答案:

答案 0 :(得分: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(...)有一个超载,可以接受超时。

详细了解Mutex on MSDN