【问题标题】:How to read from shell console event more efficiently ?如何更有效地读取 shell 控制台事件?
【发布时间】:2018-06-26 11:17:34
【问题描述】:

一个简单的控制台代码,用于读取名为 ShellStream 的控制台,

private ShellStream Shell;

public TelnetConnection(string Hostname, int Port, string MySSHHost, string MySSHRootUser, string MySSHRootUserPassword)
       {   
               SshConnection(MySSHHost, MySSHRootUser, MySSHRootUserPassword);            
               shell.DataReceived += new EventHandler<ShellDataEventArgs>(shell_DataReceived);   /// Created a event

       }

所以,下面创建了一个事件

private void shell_DataReceived( object sender, ShellDataEventArgs e)
       {
           ScbyteReceived = e.Data;
           string result = Encoding.UTF8.GetString(e.Data, 0, e.Data.Count());
           ConsoleRead = result; <---------------------here
           Console.WriteLine(result);
       }

现在我想实时读取事件,所以我创建了一个字符串变量“ConsoleRead”并将“结果”传递给它

然后在另一个函数中,我开始从控制台读取,如下所示

public string ReadWithTimeOut(int Tout)
   {
       long  mycount = 0;
       if (!sshClient.IsConnected) return null;
       StringBuilder sb = new StringBuilder();
       do
       {
           //ParseTelnet(sb);
           sb.Append(ConsoleRead);    /// <-----------------here
           System.Threading.Thread.Sleep(TimeOutMs);
           mycount += TimeOutMs;
       } while (mycount < (long) Tout);
       return sb.ToString();
   }

我知道这不是正确的方法。你们能否建议我一种更好的方法来实时从 shell 控制台读取并将其传递给 ReadWithTimeOut() 方法。请注意,我仅在需要时才调用 ReadWithTimeOut 方法。

【问题讨论】:

  • 好吧,公平地说,您的 readwithtimeout 并没有真正进行读取,它只是检查是否有读取..这看起来不像是 Id 这样做的方式,但有时需要必须并且我从未使用过 shellstream所以我不能说有更好的方法,但听起来确实应该有
  • 你从控制台读取的另一种方式是什么?
  • 我使用的是 chillkat 产品,但是,听起来您确实需要缓冲数据,然后在计时器之后进行处理
  • @BugFinder 嗨,我已经发布了我认为合适的答案。如果你也有同样的想法,请接受。谢谢
  • 我不能接受,这不是我的问题

标签: c# shell console


【解决方案1】:

好的,这是我找到的解决方案,您需要做的就是使用 Shell.read() 而不是字符串 "ConsoleRead" 。无需创建 shell 事件(在我的情况下)。 希望这对将来的某些人有所帮助。

 do
       {  
           //sb.Append(ConsoleRead);    /// <-----------------here
           sb.Append(shell.Read());    // use this instead to read directly, more efficient than previous method
           System.Threading.Thread.Sleep(TimeOutMs);
           mycount += TimeOutMs;
       } while (mycount < (long) Tout);
         return sb.ToString();

【讨论】:

    猜你喜欢
    • 2014-10-27
    • 2012-07-05
    • 2019-04-15
    • 2022-12-04
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    相关资源
    最近更新 更多