无限循环后运行代码

时间:2014-01-11 02:55:22

标签: c# while-loop infinite-loop

我正在尝试制作一个控制台应用程序。我想要 ”。 。 。” “按任意键退出”后闪烁。

闪烁工作正常,但现在我的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);
    }

3 个答案:

答案 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);
    }