我正在尝试制作一个控制台应用程序。我想要 ”。 。 。” “按任意键退出”后闪烁。
闪烁工作正常,但现在我的Console.ReadKey()是无法访问的代码
我只是想知道是否还有到达Console.ReadKey()行,或者我将它移动到能够让它运行的地方?
static void Main(string[] args)
{
string blinkExit = ". . ."; //Variable for blinking periods after 'exit'
Console.Write("\n\nPress any key to exit"); //Displays a message to press any key to exit in the console
while (true)
{
WriteBlinkingText(blinkExit, 500, true);
WriteBlinkingText(blinkExit, 500, false);
}
Console.ReadKey();
}
private static void WriteBlinkingText(string text, int delay, bool visible)
{
if (visible)
Console.Write(text);
else
for (int i = 0; i < text.Length; i++)
Console.Write(" ");
Console.CursorLeft -= text.Length;
System.Threading.Thread.Sleep(delay);
}
答案 0 :(得分:3)
看起来你只想让这个文字闪烁,直到用户按下一个键。如果是这种情况那么为什么不循环直到有可用的密钥被读取?
while (!Console.KeyAvailable)
{
WriteBlinkingText(blinkExit, 500, true);
WriteBlinkingText(blinkExit, 500, false);
}
这可以避免使用多线程时出现的所有令人讨厌的问题
答案 1 :(得分:2)
只需使用此
更改您的while代码即可 Task.Factory.StartNew(() =>
{
while (true)
{
WriteBlinkingText(blinkExit, 500, true);
WriteBlinkingText(blinkExit, 500, false);
}
});
按任意键将关闭控制台
答案 2 :(得分:0)
想象一下线程作为工作者,当你使用控制台应用程序时,你正在使用一个线程,并且通过使用一个没有结束的循环,你实际上是停止从那一点开始发生任何其他任务,因为线程是忙着循环!
要解决这个问题,你需要在循环中放置一个排序触发器,一旦按下一个键就会退出。我在下面演示了一种简单的方法。
检查代码,你会发现我使用了一个名为Interlocked
的新类,我使用它的原因是为了避免任何线程安全问题,线程安全是一个深层主题,而不是我想用几句话来解释一下,但想法是必须锁定两个不同线程之间共享的任何资源。你也会找到一个lambda表达式,这些都是中级主题,现在尝试学习它们会实现一件事......一件令人头疼的事!
private static long _isKeyPressed;
private static void Main()
{
// Create a new Thread and Start it.
new Thread(() =>
{
// Variable for blinking periods after 'exit'
const string blinkExit = ". . .";
// Displays a message to press any key to exit in the console
Console.Write("\n\nPress any key to exit");
// Run until no keys are pressed.
while (Interlocked.Read(ref _isKeyPressed) == 0)
{
WriteBlinkingText(blinkExit, 500, true);
WriteBlinkingText(blinkExit, 500, false);
}
}).Start();
Console.ReadKey();
// Once a key has been pressed, increment the value of _isKeyPressed to 1.
// This will indicate to the thread running above that it should exit it's loop.
// as _isKeyPressed is no longer equal to 0.
Interlocked.Increment(ref _isKeyPressed);
}
private static void WriteBlinkingText(string text, int delay, bool visible)
{
if (visible) Console.Write(text);
else
{
for (int i = 0; i < text.Length; i++)
{
Console.Write(" ");
}
}
Console.CursorLeft -= text.Length;
Thread.Sleep(delay);
}