C# 如何从一个线程使用Console.ReadLine并从另一个线程使用ConsoleKeys?

C# 如何从一个线程使用Console.ReadLine并从另一个线程使用ConsoleKeys?,c#,multithreading,console,console-application,console.readline,C#,Multithreading,Console,Console Application,Console.readline,我正在制作一个测试控制台应用程序。此应用程序运行一个void任务(我无法更改此事实),为了使其保持打开状态,我在Main方法的末尾插入Console.ReadLine while (true) Task.Delay(1000).Wait(); // console.ReadLine doesn't let us to read from console in other threads. 有没有办法使用其他线程中按下的每个键?我尝试了以下操作,但调用Peek会阻塞线程 loop = Task.

我正在制作一个测试控制台应用程序。此应用程序运行一个void任务(我无法更改此事实),为了使其保持打开状态,我在Main方法的末尾插入
Console.ReadLine

while (true) Task.Delay(1000).Wait(); // console.ReadLine doesn't let us to read from console in other threads.
有没有办法使用其他线程中按下的每个键?我尝试了以下操作,但调用Peek会阻塞线程

loop = Task.Run(async () =>
{
    var input = Console.In;
    while (running)
    {
        int key = input.Peek(); // blocks here forever
        if (key == -1)
        {
            await Task.Delay(50);
        }
        else
        {
            input.Read();
            if ((ConsoleKey)key == ConsoleKey.Enter)
            {
                Completed?.Invoke();
            }
            else
            {
                OnKeyDown((ConsoleKey)key);
            }
            // todo how to intercept keyup?
        }
    }
});
这是主要的方法

static void Main(string[] args)
{
    GrpcEnvironment.SetLogger(new Grpc.Core.Logging.ConsoleLogger());

    //setup MagicOnion and option.
    var service = MagicOnionEngine.BuildServerServiceDefinition(isReturnExceptionStackTraceInErrorDetail: true);

    var server = new global::Grpc.Core.Server
    {
        Services = { service },
        Ports = { new ServerPort("localhost", 12345, ServerCredentials.Insecure) }
    };

    // launch gRPC Server.
    server.Start();

    // and wait.
    Console.ReadLine();
}
我想要的基本上是在另一个线程上按下一个键盘键



我也试过了,但这对控制台应用程序不起作用。

我决定把这个而不是
console.ReadLine
放在Main方法的末尾

while (true) Task.Delay(1000).Wait(); // console.ReadLine doesn't let us to read from console in other threads.

然后我就可以做了

loop = Task.Run(() =>
{
    while (running)
    {
        var key = Console.ReadKey(true).Key;
        if (key == ConsoleKey.Enter)
        {
            Completed?.Invoke();
        }
        else
        {
            OnKeyDown(key);
        }
        // todo how to intercept keyup?
    }
});

按enter键,我们的应用程序不会关闭,但这是一个测试应用程序,按enter键退出不是我们的要求


但是如果有人仍然知道一个带有“代码>控制台”的ANWER。RealthLoad <代码>我很感激知道。 请确保尝试从实际控制台运行此功能,因为我在IDE中使用CTRL-C时,VS2017的里程数有所不同。(我应该提到的是,它使用C#7.2——用于异步主)


您的目的是保持应用程序打开,接收输入,而其他任务运行良好。应用程序线程必须保持打开状态,并且应该比其他线程具有最长的生命周期。在另一个任务中,我想执行
ReadKey
,但Main方法中的
ReadLine
会阻止其他线程中的
ReadKey
。我在想,如果可以在阅读键的同时也有
ReadLine
@general,我已经更新了这个问题。如您所见,我们启动了服务器。为使其保持打开状态,我们插入
Console.ReadLine
。但在另一个线程中,我想执行
ReadKey
。我希望这是清楚的。如果你知道其他技巧,我很高兴知道。在
Console.ReadLine()上按下任何其他线程上的按钮后,非常感谢将激活并完成应用程序,不是吗?@TheGeneral我认为这是XY问题。我很抱歉,但老实说,我是在这里解释之后才想到这个的!看看我的答案。