2011-12-27 24 views
2

私は大きな問題がありますが、おそらくそれは私のためだけに大きいです:)。 "terminal.Bind(client);" IPが悪い場合、この行は私のプログラムをハングアップさせます。私は.. IPは、10秒後に間違っている場合ので、すべてのプログラムがハングアップしている5Sが作動した後、このプログラムを停止したい:(C#一定時間後にプログラムを停止する方法は?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Rebex.TerminalEmulation; 
using Rebex.Security; 
using Rebex.Net; 

namespace Routers_info_v._1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Telnet client = new Telnet("192.168.1.1"); 
      VirtualTerminal terminal = new VirtualTerminal(80, 25); 

      terminal.Bind(client);  

      terminal.SendToServer("pass\r"); 
      terminal.SendToServer("sys ver\r"); 

      TerminalState state; 
      do 
      {   
       state = terminal.Process(2000); 
      } while (state == TerminalState.DataReceived); 

      terminal.Save("terminal.txt", TerminalCaptureFormat.Text, TerminalCaptureOptions.DoNotHideCursor); 
      terminal.Unbind(); 
      terminal.Dispose(); 
     } 
    } 
} 
+0

あなたはそれをスレッドに投げて一定時間後にスレッドを終了したいと思うでしょう。 – SQLMason

+0

〜30秒待っていますか?私はそれが接続を確立する一般的なタイムアウト期間だと思う。つまり、不正なIPへの接続を試みる際にコードがブロックされている可能性があります。私はそれが最終的に戻って、おそらく例外を引き起こすはずだと思います。ちょうど推測。 – Bengie

答えて

2

(いくつかの例外がスローされると仮定して)トライキャッチで呼び出しをラップするようにしてください:。

try 
{ 
    terminal.Bind(client);  
} 
catch(Exception ex) 
{ 
    return; 
} 
+2

これはタイムアウトを強制する目的には対処しません。 – RQDQ

+0

これは火格子であり、非常に感謝しています。 – zee

+0

@RQDQ - それ以外はあります。 IPアドレスが有効でない場合は、待つ必要はありません。現在のプロセスはIPアドレスを一度だけバインドしようとしますので、待機は無意味です。 –

2

スレッドがかかる場合は、スレッドにバインドをキックオフし、タイマーを開始することができますX完了するにはあまりにも長い秒、あなたが選択したいずれかのスレッド、またはアプリケーションを、殺すことができる

+0

ねえ!私はコメントでほぼ同じことを言った:)とにかく+1。 – SQLMason

+1

@ DanAndrews - なぜそれを回答として投稿しなかったのですか? – Oded

+0

@DanAndrews、私たちはほとんど正確な時刻に投稿したに違いない。投稿時に何もなかった。 –

0

私はネットワークの内容を第2のスレッドに入れることを提案します。このスレッドは、次にmスレッド。

class Program { 
    static void Main(string[] args) { 
     Thread thread = new Thread(threadFunc); 
     thread.Start(); 
     Stopwatch watch = new Stopwatch(); 
     watch.Start(); 
     while (watch.ElapsedMilliseconds < 5000 && thread.IsAlive) 
      ; 
     if (!thread.IsAlive) { 
      thread.Abort(); 
      Console.WriteLine("Unable to connect"); 
     } 
    } 

    private static void threadFunc() { 
     Telnet client = new Telnet("192.168.1.1"); 
     VirtualTerminal terminal = new VirtualTerminal(80, 25); 

     terminal.Bind(client);  
     // ... 
     terminal.Dispose(); 
    } 
} 
1

Task.Waitを使用できます。ここでは、10秒かかる操作のシミュレーションはほとんどありません。終了するには5秒間待っています:)

using System; 
using System.Linq; 
using System.Data.Linq; 
using System.Data; 
using System.Threading.Tasks; 


namespace ConsoleApplication5 
{ 
    class VirtualTerminal 
    { 
    public VirtualTerminal(int a, int b) { } 
    public bool Bind() { System.Threading.Thread.Sleep(10000); return true; } 
    } 
    class Program 
    { 

    static void Main(string[] args) 
    { 
     VirtualTerminal terminal = new VirtualTerminal(80, 25); 

     Func<bool> func =() => terminal.Bind() ; 
     Task<bool> task = new Task<bool>(func); 
     task.Start(); 
     if (task.Wait(5*1000)) 
     { 
     // you got connected 
     } 
     else 
     { 
     //failed to connect 
     } 


     Console.ReadLine(); 

    } 
    } 
} 
+0

コードの一部をコピーして正常に動作していますが、「terminal.SendToServer」のようなコマンドやターミナルを持つコマンドを書き込もうとします。****プログラムは「定義を含んでいません」と言っています – zee

関連する問題