проверьте, существует ли сетевой диск с тайм-аутом в С#

Я создал службу Windows, которая перемещает файлы между жестким диском сервера (где установлена ​​служба) и сетевым диском, подключенным к серверу. одной из проблем, с которыми я столкнулся при создании решения, были проблемы с сетью.

как проверить, существует ли сетевой диск, при установке тайм-аута при его проверке? Если время истекает, я перехватываю исключение и повторяю попытку через X минут и оставляю элементы в очереди.

Благодарность!


person Martin Ongtangco    schedule 18.01.2011    source источник


Ответы (2)


Поместите вызов в отдельный поток и закройте поток после определенного тайм-аута. Следующая ссылка реализует логику тайм-аута для метода:

http://kossovsky.net/index.php/2009/07/csharp-how-to-limit-method-execution-time/

ИЗМЕНИТЬ

Один из комментариев к теме выше предлагает лучшую реализацию с использованием шаблона .NET Async:

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);
   } 
person Aseem Gautam    schedule 18.01.2011
comment
Отсутствие вызова EndInvoke() — довольно неприятная утечка памяти. Восстановление занимает 10 минут. - person Hans Passant; 18.01.2011
comment
Если вы используете следующее анонимное выражение, это нарушает то, что здесь делается. SafeLimex(() => { Console.WriteLine(TEST); Thread.Sleep(10000); Console.WriteLine(Смотрите, он все еще работает!); }, 500, out testbool); - person tcables; 18.09.2013

Насколько я помню, обычные методы System.IO делают свое дело. Итак, в этом случае вы просто используете:

if (Directory.Exists("Z:\\MyNetworkFolder"))
{
    // Gogogo
}
else
{
    Thread.Sleep(MyTimeout);
}

Если папка не существует, сделайте паузу на любое время, которое вы выберете. Это должно делать работу идеально.

person Kyle Rosendo    schedule 18.01.2011
comment
Я считаю, что это НЕ то, о чем просил @martin. - person tcables; 17.09.2013