【问题标题】:ReadLine() from two sources simultaneously同时来自两个来源的 ReadLine()
【发布时间】:2014-07-30 19:07:47
【问题描述】:

这是我当前的循环。

while(!StartServer.HasExited)
{
    Console.WriteLine(StartServer.StandardOutput.ReadLine());
    StartServer.StandardInput.WriteLine(Console.ReadLine());
}

ServerStart 是我的进程的名称。问题是循环在继续之前等待输入。有没有办法同时运行 2 个循环? 像这样:

while(!StartServer.HasExited)
{
    Console.WriteLine(StartServer.StandardOutput.ReadLine());
}
while(!StartServer.HasExited)
{
    StartServer.StandardInput.WriteLine(Console.ReadLine());
}

【问题讨论】:

  • 非阻塞 IO 和/或并发/线程是两个选项。
  • 你需要了解parallel programming.
  • 这实际上比起初看起来要困难得多,假设您不想在用户输入一行时做一些刻薄的事情,比如写出文本。无论如何,您是否要这样做,等到他们汇总一行,然后打印出您从其他进程收到的所有行,您想将它们写到不同的地方吗?是否要将文本写到用户正在输入的下方的行中?
  • (OP 正在尝试将服务器和控制台 stdout/stdin 相互代理 - 这在“聊天”中很常见。)
  • @user3873786 因此,当用户尝试输入内容并且其他进程有输出时,您只想将输出粘贴在他们输入的内容中间吗?你真的确定吗?

标签: c# readline


【解决方案1】:

这样的事情怎么样

Task t1 = null, t2 = null;
while(!StartServer.HasExited)
{
       if (t1 == null || t1.IsCompleted)
           t1= Task.Run(() =>  Console.WriteLine(StartServer.StandardOutput.ReadLine()));
       if (t2 == null || t2.IsCompleted)
           t2 = Task.Run(() => StartServer.StandardInput.WriteLine(Console.ReadLine()));
       Task.WaitAny(new[] { t1, t2 });
}

也许您甚至可以更聪明地只回收已完成的任务。

【讨论】:

  • 这会不断地排队大量未完成的任务。因此,例如,如果您从另一个进程连续收到 3 行,您将有 3 个不同的线程都试图从控制台读取一行。如果您连续写出三行,您将有三个线程都试图从另一个进程读取一行输出并将它们写入控制台。这还没有考虑到可能发生的各种竞争条件、由于缺乏同步而导致的行顺序变化、在您尝试读取一行的同时写一行等等。
  • 另外,您应该停止删除您的答案并发布新答案。如果您想更改答案,请编辑您的答案。
  • 回收的任务,很抱歉我有两个帖子,所以我重做了整个事情
  • 这很好用!非常感谢。 :D 顺便说一句,小编辑,你在第 3 行打错了(“t 1=”应该是“t1=”)。
  • @user3873786 它工作得很好,除了它不能正常工作的所有时候......仅仅因为它工作有时并不意味着它工作一直.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多