2009-04-14 57 views
1

我目前使用第三方組件來處理在.NET telnet連接。我希望它是同步的,我發送一個命令到接收telnet服務器,然後我得到的響應作爲文本或字節數組。唯一的問題是該組件未設置爲執行此操作。該組件允許我將命令發送到服務器,但響應通過函數句柄返回。所以實質上,我需要一種在處理程序處理它時暫停應用程序的方法。下面是我計劃如何避開這一問題的例子:創建一個循環暫停腳本的時候,回調函數運行

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

將帶動CPU使用率100%(當然,1個核多核機器上的100%),並離開那裏,久治不愈。

這會餓死的CPU功率的其他進程,並可以防止遠程登錄組件從,因爲你已經繞過了消息泵在所有工作

有更好的方法,但沒有對你在做什麼的詳細信息,這將是很難爲您提供諮詢。

首先,你要一個WindowsForms/WPF /控制檯應用程序?

[和,使用註釋來回答,不回答。]

+0

作爲一個測試,我正在使用它在一個控制檯應用程序。最終它將成爲ASP.NET頁面的一部分,並且來自Telnet服務器的輸出將被寫入頁面響應中。 – regex 2009-04-14 20:21:30

0

一個更好的辦法是產卵的Telnet處理到另一個線程。這樣你可以讓主線程等待telnet處理完成。

有穿線一些非常好的教程一看here