在C#中检查网络驱动器是否存在,并设置超时

4
我创建了一个Windows服务,用于在服务器的硬盘(安装服务的位置)和映射到服务器的网络驱动器之间移动文件。在创建解决方案时,我遇到的问题之一是网络问题。
在设置检查网络驱动器是否存在的超时时间时,如何检查?如果超时,我会捕获异常并在X分钟后重试,并将项目留在队列中。
谢谢!
2个回答

8
将调用放在一个单独的线程中,并在一定时间后关闭该线程。下面的链接实现了一种方法的超时逻辑:http://kossovsky.net/index.php/2009/07/csharp-how-to-limit-method-execution-time/ 编辑 上述主题的评论之一建议使用.NET异步模式进行更好的实现。
public static T SafeLimex<T>(Func<T> F, int Timeout, out bool Completed)   
   {
       var iar = F.BeginInvoke(null, new object());
       if (iar.AsyncWaitHandle.WaitOne(Timeout))
       {
           Completed = true;
           return F.EndInvoke(iar);
       }
         F.EndInvoke(iar);
         Completed = false;
       return default(T);
   } 

1
不调用EndInvoke()会导致相当严重的内存泄漏。需要花费10分钟才能恢复。 - Hans Passant
如果您使用以下匿名表达式,它会破坏这里想要实现的目标。 SafeLimex(() => { Console.WriteLine("TEST"); Thread.Sleep(10000); Console.WriteLine("See, it still runs!"); }, 500, out testbool); - tcables

0
据我所记,使用普通的System.IO方法就可以解决问题。因此,在这种情况下,你只需要使用以下代码即可:
if (Directory.Exists("Z:\\MyNetworkFolder"))
{
    // Gogogo
}
else
{
    Thread.Sleep(MyTimeout);
}

如果文件夹不存在,则暂停您选择的任何超时时间。这应该完美地完成工作。

1
我相信这不是@martin所要求的。 - tcables

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接