当SshStream不再有效时,SshStream.Expect()会中断代码

时间:2016-10-19 13:09:52

标签: c# ssh.net

我试图通过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?每次我需要访问服务器时,我都可以创建一个新流,但由于我每秒轮询一次参数,我不希望每次都重新连接。

1 个答案:

答案 0 :(得分:0)

我误以为线程消失的代码执行停止了。而是线程休眠等待输入。 Expect超时超载,我本应该使用它。