等待延迟破坏打字机效果C#?

时间:2019-02-11 23:18:53

标签: c# winforms async-await

我正在制作一个应用程序,希望在其中添加外观很酷的打字机效果,而不会使UI死于thread.sleep。

所以我只是在四处寻找解决方案,以查找我在班级中展示的异步内容,但一切都坏了,但我不明白为什么。 之前它运行良好,但用户界面现在冻结了,但是文本是随机字符

旧(可以正常工作,但会冻结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;
    }

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

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

我希望新代码可以解决它的ui冻结问题,但是文本在某种程度上是不可读的。 这是之前和之后的结果:

之前(将旧代码与ui冻结结合使用):

ModuleRemover is aan het kijken voor updates.
ModuleRemover is al de laatste versie! (versie 2.4)

之后:

MMododuuleleReRemomvoveerr i is s aaanl  hdeet l kaaitjsketen  vveoorsr iuep! d(atveesrs.
ie 2.4)

2 个答案:

答案 0 :(得分:5)

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

大概是async版本,您可以同时启动两个Write调用,并让它们并行运行-实际上,它们将同时键入字符。

修复:使Write返回Task

private async Task Write(string text) …

await进行第一次调用,然后再进行第二次调用(您可能还需要使方法调用Write来保持异步:

await Write("First one");
await Write("Second one");

答案 1 :(得分:0)

UI冻结的原因可能是因为您正在使用UI线程。这将冻结它。

private bool Write(string text)
{
    var t;
    foreach (char c in text)
    {
        t = Task.Run(() => Console.AppendText(c.ToString());
        t.Wait(TimeSpan.FromMilliseconds(50));
    }
    t = Task.Run(() => Console.AppendText(Console.AppendText(Environment.NewLine));
    t.Wait(); // wait for completion.
    return true;
}