Использование Directory.Exists в сетевой папке, когда сеть не работает - PullRequest
12 голосов
/ 08 декабря 2011

База кода моей компании содержит следующую строку C #:

bool pathExists = Directory.Exists(path);

Во время выполнения строка path оказывается адресом папки во внутренней сети компании - что-то вроде \\company\companyFolder. Когда соединение с моей Windows-машиной в интрасети установлено, это работает нормально. Однако, когда соединение обрывается (как это произошло сегодня), выполнение приведенной выше строки вызывает полное зависание приложения. Я могу только закрыть приложение, убив его с помощью диспетчера задач.

Конечно, я бы предпочел Directory.Exists(path) return false в этом сценарии. Есть ли способ сделать это?

Ответы [ 2 ]

12 голосов
/ 08 декабря 2011

Нет способа изменить поведение Directory.Exists для этого сценария.Под капотом он делает синхронный запрос по сети в потоке пользовательского интерфейса.Если сетевое соединение зависает из-за сбоя, слишком большого трафика и т. Д. ... это также приведет к зависанию потока пользовательского интерфейса.

Лучшее, что вы можете сделать, это сделать этот запрос из фонового потока и явносдаваться по истечении определенного количества времени.Например

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;
}
1 голос
/ 08 декабря 2011

Если основное сетевое подключение является вашей основной проблемой, вы можете попробовать проверить сетевое подключение до этого:

    [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-минутный тайм-аут в сети.

...