C# 当网络关闭时,正在使用目录。存在于网络文件夹中

C# 当网络关闭时,正在使用目录。存在于网络文件夹中,c#,networking,connection,C#,Networking,Connection,我公司的代码库包含以下C#行: 在运行时,字符串路径恰好是公司内部网上某个文件夹的地址-类似于\\company\companyFolder。当从我的Windows计算机到intranet的连接启动时,这一切正常。但是,当连接断开时(就像今天一样),执行上面的行会导致应用程序完全冻结。我只能通过使用任务管理器关闭应用程序来关闭它 当然,在这种情况下,我更愿意使用Directory.Exists(path)returnfalse。有办法做到这一点吗?没有办法更改目录的行为。此场景中存在。在后台,它

我公司的代码库包含以下C#行:

在运行时,字符串
路径
恰好是公司内部网上某个文件夹的地址-类似于
\\company\companyFolder
。当从我的Windows计算机到intranet的连接启动时,这一切正常。但是,当连接断开时(就像今天一样),执行上面的行会导致应用程序完全冻结。我只能通过使用任务管理器关闭应用程序来关闭它


当然,在这种情况下,我更愿意使用
Directory.Exists(path)
return
false
。有办法做到这一点吗?

没有办法更改
目录的行为。此场景中存在
。在后台,它在UI线程上通过网络发出同步请求。如果网络连接因中断、流量过大等原因而挂起。。。它也会导致UI线程挂起

最好是从后台线程发出此请求,并在经过一定时间后明确放弃。比如说

Func<bool> func = () => Directory.Exists(path);
Task<bool> task = new Task<bool>(func);
task.Start();
if (task.Wait(100)) {
  return task.Value;
} else {
  // Didn't get an answer back in time be pessimistic and assume it didn't exist
  return false;
}
Func=()=>目录。存在(路径);
任务任务=新任务(func);
task.Start();
如果(任务等待(100)){
返回任务值;
}否则{
//没有及时得到答案悲观一点,假设它不存在
返回false;
}

如果一般网络连接是您的主要问题,您可以尝试在此之前测试网络连接:

    [DllImport("WININET", CharSet = CharSet.Auto)]
    static extern bool InternetGetConnectedState(ref int lpdwFlags, int dwReserved);

    public static bool Connected
    {
        get
        {
            int flags = 0;
            return InternetGetConnectedState(ref flags, 0);
        }
    }
然后确定路径是否为UNC路径,如果网络脱机,则返回false:

    public static bool FolderExists(string directory)
    {
        if (new Uri(directory, UriKind.Absolute).IsUnc && !Connected)
            return false;
        return System.IO.Directory.Exists(directory);
    }

当您尝试连接的主机处于脱机状态时,这些都没有帮助。在这种情况下,您仍然需要2分钟的网络超时。

这很容易耗尽线程池中的所有可用线程,从而导致应用程序中出现更多问题。如果要执行类似操作,则需要能够在超时后终止操作。@csharptest.net这就是问题所在,但您不能。无法控制
Directory.Exists
方法的超时,因为它实际上会立即下降到本机代码事件
Thread.Abort
对您没有帮助。
    public static bool FolderExists(string directory)
    {
        if (new Uri(directory, UriKind.Absolute).IsUnc && !Connected)
            return false;
        return System.IO.Directory.Exists(directory);
    }