2011-01-18 12 views
3

サーバのハードドライブ(サービスがインストールされている場所)とサーバにマップされているネットワークドライブの間でファイルを移動するWindowsサービスを作成しました。解決策を作成する際に遭遇した問題の1つは、ネットワークの問題でした。ネットワークドライブがタイムアウトしているかどうかを確認します。#

チェックする際にタイムアウトを設定しているときにネットワークドライブが存在するかどうかを確認するにはどうすればよいですか?タイムアウトした場合は、例外を捕捉してX分で再試行し、アイテムをキューに残します。

ありがとうございました!

答えて

7

コールを別のスレッドに入れ、一定のタイムアウト後にスレッドを閉じます。

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

EDIT上記のトピックについてのコメントを

一つ.NET非同期パターンを使用して、より良い実装を提案する:

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); 
    } 
次のリンクは、メソッドのタイムアウトロジックを実装します
+1

EndInvoke()を呼び出していないと、かなり厄介なメモリリークです。回復するまでに10分かかります。 –

+0

ヒントをお願いします。 –

+0

次の匿名式を使用すると、ここで達成しようとしていることが壊れます。 == {Console.WriteLine( "TEST"); Thread.Sleep(10000); Console.WriteLine( "まだ実行されています!");}、500、out testbool); SafeLimex – tcables

0

私が思い出す限り、通常のSystem.IOメソッドを使用すると、そのトリックを行います。この場合、次のように単純に使用します。

フォルダが存在しない場合は、選択したタイムアウトの間、一時停止します。これは仕事を完璧にするはずです。

+0

これは@martinが求めているものではないと思います。 – tcables

関連する問題