在网络关闭时,在网络文件夹上使用Directory.Exists

use*_*813 12 c# connection networking

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

bool pathExists = Directory.Exists(path);
Run Code Online (Sandbox Code Playgroud)

在运行时,字符串path恰好是公司内部网上文件夹的地址 - 类似于\\company\companyFolder.当从我的Windows机器到内联网的连接启动时,这可以正常工作.但是,当连接断开时(就像今天一样),执行上面的行会导致应用程序完全冻结.我只能通过使用任务管理器将其删除来关闭应用程序.

当然,我宁愿在这种情况下Directory.Exists(path)回归false.有没有办法做到这一点?

Jar*_*Par 12

无法更改Directory.Exists此方案的行为.在引擎盖下,它在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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这可能会轻易占用线程池中的所有可用线程,从而导致应用程序中出现进一步的问题.如果你要做这样的事情,你需要能够在超时结束后终止操作. (4认同)