2009-04-14 2 views
1

현재 .NET에서 타사 구성 요소를 사용하여 텔넷 연결을 처리하고 있습니다. 수신 텔넷 서버에 명령을 보내는 곳을 동기식으로 설정하고 응답을 텍스트 또는 바이트 배열로 반환합니다. 문제는 구성 요소가이를 수행하도록 설정되어 있지 않다는 것입니다. 구성 요소를 사용하면 서버에 명령을 보낼 수 있지만 응답은 함수 핸들을 통해 반환됩니다. 따라서 본질적으로 처리기가 처리하는 동안 응용 프로그램을 일시 중지하는 방법이 필요합니다. 여기에 내가 그 문제를 해결하기 위해 계획하는 방법의 예는 다음과 같습니다콜백 함수가 작동하는 동안 스크립트를 일시 중지하는 루프 만들기

static void Main(string[] args) 
    { 
     Telnet telCon = new Telnet(); 
     telCon.OnDataIn += new Telnet.OnDataInHandler(HandleDataIn); 
     telCon.Connect(remoteHostStr); 

     while (true) ; 
    } 

    public static void HandleDataIn(object sender, TelnetDataInEventArgs e) 
    { 
     string responseStr = e.Text; 

     if (responseStr.Contains("Username:")) 
     { 
      ((Telnet)sender).Send(System.Text.ASCIIEncoding.ASCII.GetBytes(username)); 
     } 
     else if (responseStr.Contains("Password:")) 
     { 
      ((Telnet)sender).Send(System.Text.ASCIIEncoding.ASCII.GetBytes(password)); 
     } 
    } 

while 항상 실행하기 때문에 위의 솔루션이 작동하지 않습니다,하지만 난 아마 전역 변수의 일종으로 사용하는 미래의 버전을 구축 할 것 루프가 여전히 실행되어야하는지 추적하십시오. 그러나 프로그래밍에 대해 제가 배웠던 모든 것은 이것이 매우 더럽다고 말합니다. 누구나 내 딜레마에 대해 다른 생각을 할 수 있습니까?

감사합니다, 크리스

답변

1

다음은 이벤트 처리기에서 처리가 완료 될 때까지 ManualResetEvent를 사용하여 실행을 일시 중지하고 (프로그램 지연을 지연시키는) 예제입니다.

static ManualResetEvent finishGate; 

static void Main(string[] args) 
{ 
    finishGate = new ManualResetEvent(false); // initial state unsignaled 

    Telnet telCon = new Telnet(); 
    telCon.OnDataIn += new Telnet.OnDataInHandler(HandleDataIn); 
    telCon.Connect(remoteHostStr); 

    finishGate.WaitOne(); // waits until the gate is signaled 
} 

public static void HandleDataIn(object sender, TelnetDataInEventArgs e) 
{ 
    // handle event 

    if (processingComplete) 
     finishGate.Set(); // signals the gate 
} 

으로 ManualResetEvent의 WaitOne() 메소드는 밀리 초의 시간 범위 또는 번호를 받아 재를 포함한다. bool을 반환합니다. 신호가 발생하면 true를 반환하고, 시간이 초과되면 false를 반환합니다. 루프에 넣으면 주 스레드가 30 초마다 깨어나서 하우스 키핑 작업을 수행 할 수 있지만 게이트가 신호를 받으면 즉각적인 응답을 얻을 수 있습니다.

0

귀하의 while 루프 :

while(true) ; 

100 % (물론, 100 % 멀티 코어 시스템에서 1 개 코어)에 CPU 사용량을 운전하고 영구적으로 거기를 떠날 것이다.

이렇게하면 메시지 처리기를 건너 뛰었 기 때문에 다른 CPU 프로세스가 작동하지 않고 텔넷 구성 요소가 작동하지 않을 수 있습니다. .

더 좋은 방법이 있지만, 현재 진행중인 작업에 대한 자세한 정보가 없으면 조언하기가 어려울 수 있습니다.

시작하려면 WindowsForms/WPF/Console 응용 프로그램을 원하십니까?

[그리고 는 답변을하지 대답 주석을 사용하시기 바랍니다.] 일반적으로

+0

테스트로서 콘솔 응용 프로그램에서 사용하려고합니다. 결국 이것은 ASP.NET 페이지의 일부가되며 텔넷 서버의 출력은 페이지 응답에 기록됩니다. – regex

0

더 좋은 방법은 텔넷 처리를 다른 스레드에 알리는 것입니다. 그렇게하면 텔넷 처리가 완료 될 때까지 대기 할 주 스레드를 얻을 수 있습니다.

here 스레딩에 대한 아주 좋은 자습서를보십시오.

관련 문제