2011-12-08 6 views
11

です:実行時に使用Directory.Existsネットワークがダウンして私の会社のコードベースは、次のC#の行が含まれ

bool pathExists = Directory.Exists(path); 

は、文字列pathは、同社の上のフォルダのアドレスをあることを起こりますイントラネット - \\company\companyFolderのようなもの。私のWindowsマシンからイントラネットへの接続がアップすると、これは正常に動作します。しかし、接続が切断されると(今日のように)、上記の行を実行するとアプリケーションが完全にフリーズします。タスクマネージャでアプリケーションを強制終了するだけで、アプリケーションをシャットダウンできます。

このシナリオではもちろん、私はDirectory.Exists(path)返信falseを持っています。これを行う方法はありますか?

答えて

11

このシナリオでは、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; 
} 
+3

これは、スレッドプール内の利用可能なスレッドをすべて使い尽くして、アプリケーション内でさらに問題を引き起こす可能性があります。このようなことをするなら、タイムアウトが経過した後に操作を終了できる必要があります。 –

+0

@ csharptest.netそれは問題ですが、できません。 'Directory.Exists'メソッドは、タイムアウトのために制御することはできません。ネイティブコードイベントの直後に' Thread.Abort'が役立ちません。 – JaredPar

1

一般的なネットワーク接続があなたの主な問題がある場合は、これに先立ってネットワーク接続をテストしてみてください:パスはUNCパスである場合

[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); 
     } 
    } 

が次に決定した場合はfalseを返しますネットワークがオフラインです:

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

これは、接続しようとしているホストがオフラインの場合に役立ちません。その場合、まだ2分のネットワークタイムアウトがあります。

関連する問題