C# 控制台应用程序 - 如何始终从控制台读取输入?

2024-03-12

我目前正在编写一个使用大量多线程的控制台应用程序。我希望能够始终允许用户在控制台中输入内容,但是,线程会定期输出到控制台,但我希望用户始终能够在控制台中输入内容,并由我来处理输入。

我将如何实现这一目标?我在网上没有找到任何相关内容?

先谢谢了!

顺便说一句,这是针对 c# 的!


Edit。我几年前的原始答案依赖于用户输入魔术字符串来结束控制台侦听器,而忽略了 CTL+C 已经是默认的取消信号。

class Program
{
    readonly static CancellationTokenSource _cancelTokenSrc = new CancellationTokenSource();

    static void Main(string[] args)
    {
        // CTL + C is the built-in cancellation for console apps; 
        Console.CancelKeyPress += Console_CancelKeyPress;
        CancellationToken cancelToken = _cancelTokenSrc.Token;

        Console.WriteLine("Type commands followed by 'ENTER'");
        Console.WriteLine("Press CTL+C to Terminate");
        Console.WriteLine();
        try
        {
            // thread that performs background work until cancelled
            Task.Run(() => DoWork(), cancelToken);
            // thread that listens for keyboard input until cancelled
            Task.Run(() => ListenForInput(), cancelToken);
            // continue listening until cancel signal is sent
            cancelToken.WaitHandle.WaitOne();
            cancelToken.ThrowIfCancellationRequested();
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("Operation Canceled.");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }

    static void ListenForInput()
    {
        while (true)
        {
            string userInput = Console.ReadLine();
            if(!String.IsNullOrWhiteSpace(userInput))
                Console.WriteLine($"Executing user command {userInput}...");
        }
    }

    static void DoWork()
    {
        while (true)
        {
            Thread.Sleep(3000);
            Console.WriteLine("Doing work...");
        }
    }

    static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
    {
        // we want to cancel the default behavior so we can send the cancellation signal
        // to our background threads and not just terminate here
        e.Cancel = true;
        Console.WriteLine("Cancelling...");
        _cancelTokenSrc.Cancel();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 控制台应用程序 - 如何始终从控制台读取输入? 的相关文章

随机推荐

  • 在 Matlab 图中重叠两个轴

    我正在寻找一种方法来覆盖 x y 时间序列 比如用 plot 创建的 在 contourf 生成的显示之上 在 y 轴上具有不同的缩放比例 似乎在两个 x y 图的情况下执行此操作的典型方法是使用内置函数 plotyy 它甚至可以由 plo
  • 实体框架代码优先一对一必需-必需关系

    使用 Entity Framework Code First 4 3 1 时 可以创建具有多重性的 1 对 1 关系 也就是说 关系的每一端都有一个实体 可以将一对一关系配置为需要 需要 or 必需 可选 然而 当我在两者之间切换时 我没有
  • Spark - 它如何在节点周围分发数据?

    Spark如何将数据分发给worker 工作人员是从数据源读取数据 还是驱动程序读取数据并将其发送给工作人员 当一个工作人员需要另一个工作人员中的数据时 他们是否直接进行通信 Thanks 如果您使用分布式输入法 例如SparkContex
  • 如果对于屏幕来说太长,则使水平单选按钮换行

    所以我有以下单选按钮 我想让它们像这样显示 然而 出现这种情况 我怎样才能让它像上面那样显示 我可以在 Eclipse 中的 GUI 编辑器中移动它 但它会从 RadioGroup 中删除 RadioButton 在组内 它忽略所有其他布局
  • 对象初始值设定项和构造函数有什么区别?

    两者之间有什么区别 何时使用 对象初始值设定项 而不是 构造函数 反之亦然 我正在使用 C 如果这很重要的话 另外 对象初始值设定项方法是否特定于 C 或 NET 对象初始值设定项是 C 3 中添加的内容 目的是在使用对象时简化对象的构造
  • 强制抽象类属性由具体类实现

    考虑这个抽象类和实现它的类 from abc import ABC class FooBase ABC foo str bar str baz int def init self self bar bar self baz baz clas
  • 无论如何,在一个 neo4j 实例上有多个数据库?

    从关系数据库的思维方式来看 每个 Neo4j 实例只有一个图形数据库似乎很奇怪 我们的想法是从根开始创建多个子图吗 Thanks 根 节点的概念正在消失 这存在很多问题 其中大部分与节点密度有关 我相信您问题的核心在于数据库设计 以及拥有多
  • Eclipse 类似于:“无法确定 [项目名称]/[文件路径]/[文件名称] 的 URI”

    主要问题 我在 Eclipse Luna 上遇到以下错误 有一天 您上班并尝试启动 Eclipse 并提高工作效率 但是工作台一打开 您就会看到所有文件选项卡都出现错误 如下所示 无法确定 my project path to file f
  • 与 object.prop 相比,使用 `in` 有什么好处?

    我们都看到该功能检测到执行以下操作 var touch function return ontouchstart in window 但我想知道使用它是否还有其他好处in类似这样的操作符 这可以节省一些字节 var touch functi
  • 获取 JavaScript 对象的第一个键名称[重复]

    这个问题在这里已经有答案了 假设我们有以下 JavaScript 对象 ahash one 1 2 3 two 4 5 6 是否有一个函数可以返回给定对象的第一个键名称 从上面的例子我想得到one作为该功能的结果 在 JavaScript
  • netty ChannelInboundHandlerAdapter 将帧裁剪为 ~1500 字节

    我已经实现了一个服务器应用程序 它使用 netty 框架通过 ChannelInblundHandlerAdapter 读取传入的字节 如标题所示 我的问题是 我不定期地从客户端获取内容 我认为这些内容在 1 500 字节后被剪切 例如 在
  • OSGi 声明性服务的绑定顺序

    假设我使用 OSGi 声明性服务 并且我有一个服务 该服务具有多个带有策略 动态的引用 A 强制一元 B 强制一元 C 强制倍数 D 可选一元 E 可选的多个 当我的服务开始时 所有参考资料都可用 有没有办法控制bind的调用顺序 我想让
  • 即使在 webpack 配置中拆分后,供应商代码仍然位于 bundle.js 文件中

    使用下面的 webpack 配置 我仍然在 bundle js 文件中获取供应商代码 即使在代码分割之后 bundle js 的大小也保持不变 我希望供应商代码不应出现在bundle js 中 遵循某些链接 但没有帮助 https gith
  • 使用 array_map() 访问第一级键,而不调用 `array_keys()`

    有没有办法做这样的事情 test array array first key gt first value second key gt second value var dump array map function a b return
  • 如何在 D3 中重用两个(或更多)链式转换序列

    我必须应用两个非常长的链式转换序列 它们主要在转换顺序上有所不同 并且我正在寻找一种紧凑的编码方式 作为一个玩具示例 考虑序列顺序应该是的情况a b c d e f g h and e f g h a b c d 我已经尝试使用下面的代码
  • AudioQueue内存播放示例

    有人知道使用 AudioQueue 从内存源播放的任何示例吗 我可以从文件中找到播放的所有示例 使用 AudioFileReadPackets 但在我的特定情况下 我自己实时生成数据 因此理想情况下 我想自己将数据排入队列 而不是使用回调将
  • 在开发期间清除 Rails 会话

    如何清除 Rails 会话以便我可以重新开始 我知道我可以用以下方法使每个会话变量无效session my var nil 但是是否有 rake 任务或知道如何将会话数据恢复为其最基本形式的任务 我在用着Spree http demo sp
  • phpMyadmin 数据库导入错误 #1046 - 未选择数据库

    我有一个从另一台计算机上的 phpmyadmin 导出的 sql 文件 我尝试在此计算机上导入该文件 但收到此错误 Error SQL查询 Database phplogin Table structure for table people
  • 如何让div居中对齐?

    我想要一个垂直和水平居中的 div 即位于页面的中心 我尝试了position absolute并将div的右上角左下角设置为0 但问题是 当我放大页面时 它与其他标题和其他 div 重叠 请帮我 如何在放大页面时将 div 定位在页面中心
  • C# 控制台应用程序 - 如何始终从控制台读取输入?

    我目前正在编写一个使用大量多线程的控制台应用程序 我希望能够始终允许用户在控制台中输入内容 但是 线程会定期输出到控制台 但我希望用户始终能够在控制台中输入内容 并由我来处理输入 我将如何实现这一目标 我在网上没有找到任何相关内容 先谢谢了