我目前正在编写一个使用大量多线程的控制台应用程序。我希望能够始终允许用户在控制台中输入内容,但是,线程会定期输出到控制台,但我希望用户始终能够在控制台中输入内容,并由我来处理输入。
我将如何实现这一目标?我在网上没有找到任何相关内容?
先谢谢了!
顺便说一句,这是针对 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(使用前将#替换为@)