System.Threading.Thread.Sleep()在单击一行时冻结我的代码

时间:2015-10-12 16:17:24

标签: c# console-application

我创建了一种慢慢为游戏编写文本的方法。 问题是,当方法运行并且我在cmd窗口中选择了鼠标时,整个程序会冻结,当我按下escape时它会继续。有什么我可以做的,所以它不会发生吗?我可以使用与System.Threading.Thread.Sleep()不同的东西让我的程序等待吗?

static void slowly(string sen)
{
    for (int j=0; j<sen.Length-1; j++)
    {
        Console.Write(sen[j]);
        System.Threading.Thread.Sleep(100);
    }
    Console.WriteLine(sen[sen.Length-1]);
    System.Threading.Thread.Sleep(100);
}

2 个答案:

答案 0 :(得分:2)

问题是您的睡眠代码正在&#34;主线程&#34;你的申请。这意味着您的应用程序在.slowly()方法中无法做任何其他事情。

你需要做类似@vidstige所显示的内容,即让你的.slowly()方法在另一个(帮助者)线程中运行。

更现代的方法是:

        static async Task slowly(string sen)
    {
        await Task.Run(() =>
        {
            for (int j = 0; j < sen.Length - 1; j++)
            {
                Console.Write(sen[j]);
                System.Threading.Thread.Sleep(100);
            }
            Console.WriteLine(sen[sen.Length - 1]);
            System.Threading.Thread.Sleep(100);
        });
    }

    public static void Main(string[] args)
    {

        var slowlyTask = slowly("hello world");

        //do stuff while writing to the screen
        var i = 0;
        i++;

        //wait for text to finish writing before doing somethign else
        slowlyTask.Wait();

        //do another something after it's done;
        var newSlowlyTask = slowly("goodbye");
        newSlowlyTask.Wait();
    }

PS:对这个问题的否定回答数量令人失望:(

答案 1 :(得分:0)

    static void slowly(string sen)
    {
        var thread = new System.Threading.Thread(() => {
            for (int j=0; j<sen.Length-1; j++)
            {
                System.Console.Write(sen[j]);
                System.Threading.Thread.Sleep(100);
            }
            System.Console.Write(sen[sen.Length-1]);
            System.Threading.Thread.Sleep(100);
        });
        thread.Start();
    }