C# 如何从一个线程使用Console.ReadLine并从另一个线程使用ConsoleKeys?
我正在制作一个测试控制台应用程序。此应用程序运行一个void任务(我无法更改此事实),为了使其保持打开状态,我在Main方法的末尾插入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.
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问题。我很抱歉,但老实说,我是在这里解释之后才想到这个的!看看我的答案。