等待延迟毁了打字机效果c#?

Swi*_*ift 1 c# winforms async-await

我正在制作一个应用程序,我想在其中添加一个很酷的打字机效果,而不会使用thread.sleep冻结UI.

所以我只是在寻找一个解决方案来找到我在课堂上发现的异步事情,一切都破了,但我不明白为什么.它之前工作得很完美,但ui冻结现在它没有,但文本是随机字符

旧的(工作但冻结ui):

    private bool Write(string text)
    {
        foreach (char c in text)
        {
            Console.AppendText(c.ToString());
            System.Threading.Thread.Sleep(5);
        }
        Console.AppendText(Environment.NewLine);
        return true;
    }
Run Code Online (Sandbox Code Playgroud)

新的(奇怪的字符不会冻结ui):

    private async void Write(string text){
        foreach (char c in text)
        {
            Console.AppendText(c.ToString());
            await Task.Delay(5);
        }
        Console.AppendText(Environment.NewLine);
    }
Run Code Online (Sandbox Code Playgroud)

我希望新的代码可以解决它所做的ui冻结,但是文字是不可读的......这里是前后的结果:

之前(使用ui冻结的旧代码):

ModuleRemover is aan het kijken voor updates.
ModuleRemover is al de laatste versie! (versie 2.4)
Run Code Online (Sandbox Code Playgroud)

后:

MMododuuleleReRemomvoveerr i is s aaanl  hdeet l kaaitjsketen  vveoorsr iuep! d(atveesrs.
ie 2.4)
Run Code Online (Sandbox Code Playgroud)

Ale*_*kov 5

使用同步循环,您可以阻止任何其他活动,直到您的代码完成"键入".结果第二次调用Write将不得不等待并且输出不会与第一次的输出混合.

据推测,async你可以同时启动两个Write调用并让它们并行运行 - 实际上它们会同时输入字符.

修复:Write退货Task

private async Task Write(string text) …
Run Code Online (Sandbox Code Playgroud)

并且await在进行第二次调用之前首先调用(您可能需要使方法调用Write也是异步的:

await Write("First one");
await Write("Second one");
Run Code Online (Sandbox Code Playgroud)