我试图通过SSH进行自动化,但是服务器出错并且没有正确实现exec通道,因此我最终使用CreateShellStream()
进行了解决方法。我可以预期,在运行程序时,连接将无法使用,断开连接是一件事。我的解决方案:
while(!_cancellationToken.IsCancellationRequested))
{
ShellStream stream = null;
while(stream == null)
{
stream = await GetSshStream();
}
while(stream.CanWrite && stream.CanRead)
{
stream.WriteLine(command);
//this breaks everything if stream is not valid
var rep = stream.Expect(new Regex(@"[$>]"));
var delimiters = new[] { " ", "\r\n", "\t" };
var values = rep.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
DealWithValues(values);
}
}
这可以工作并等待连接,一旦连接启动com。问题出现了stream.CanWrite && stream.CanRead
不足以检测stream
是否健康,一旦连接丢失且流变为无效并与Expect();
一起使用,一切都会中断。跳出所有循环,经过try {} catch{}
甚至使Visual Studio调试器步进分解并在另一个线程(多线程程序)中继续该程序。有没有办法阻止这种情况发生并将执行权重新推回到while
?每次我需要访问服务器时,我都可以创建一个新流,但由于我每秒轮询一次参数,我不希望每次都重新连接。
答案 0 :(得分:0)
我误以为线程消失的代码执行停止了。而是线程休眠等待输入。 Expect
超时超载,我本应该使用它。