我目前正在使用第三方组件来处理.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
将始终运行,但我可能会构建一个使用某种全局变量来跟踪循环是否仍然需要运行的未来版本。然而,我所学的关于编程的一切都说这很脏。任何人都可以想到另一种解决我的困境的方法吗?
谢谢, 克里斯
答案 0 :(得分: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秒唤醒一次并执行一些内务处理任务,但在门信号发出时仍然会有一个瞬时响应。
答案 1 :(得分:0)
你的while循环:
while(true) ;
将CPU使用率提高到100%(以及多核计算机上1核心的100%)并将其永久保留在那里。
这会使其他CPU能力进程匮乏,并且可能会阻止Telnet组件完全,因为您已绕过消息泵。
有更好的方法,但如果没有关于你正在做什么的更多信息,很难建议你。
首先,您想要一个WindowsForms / WPF / Console应用程序吗?
[并且请,使用评论来回答,而不是答案。]
答案 2 :(得分:0)
通常,当真的需要等待时,请使用WaitHandle。在这种情况下,ManualResetEvent可能就是您所需要的。
答案 3 :(得分:0)
更好的方法是将Telnet处理产生到另一个线程。这样你就可以让主线程等待telnet处理完成。
看看here有关线程的一些非常好的教程。