2011-12-27 2 views
2

큰 문제가 있지만 아마 그것은 나를 위해 큰 것 같습니다. :) "터미널. 바인딩 (클라이언트);" 이 줄은 IP가 좋지 않으면 프로그램이 멈추는 원인이됩니다. 나는 IP는 모든 프로그램이 중지입니다 10 초 후 잘못된 경우 때문에 작업을 5 초 후이 프로그램을 중지하려면 .. :(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

I을 네트워크 물건을 두 번째 쓰레드에 집어 넣을 것을 제안 할 것이다. 두번째 쓰레드는 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

관련 문제