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

System.Threading.Thread.Sleep() freezes my code when clicking on a line

我创造了一种为游戏慢慢写文字的方法。 问题是,当方法是 运行 并且我 select 在 cmd window 中使用鼠标时,整个程序冻结,当我按 Esc 键时它继续。有什么我可以做的,所以它不会发生吗?我可以使用不同于 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);
}
    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();
    }

问题是您的睡眠代码是 运行ning 在您应用程序的 "Main Thread" 上。这意味着您的应用程序在 .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:这个问题的负面回答数量令人失望:(