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

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


所以我只是四处寻找一个解决方案,找到我在课堂上展示的异步的东西,一切都坏了,但我不明白为什么。它以前工作完美,但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;

    }

新(奇怪的字符不会冻结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)


一只甜甜圈
浏览 105回答 2
2回答

三国纷争

使用同步循环,您可以阻止任何其他活动,直到代码完成“键入”。因此,第二次调用将不得不等待,并且输出不会与第一个调用的输出混合。Write据推测,在版本中,您可以同时启动两个调用并让它们并行运行 - 实际上它们会同时键入字符。asyncWrite修复:退货WriteTaskprivate async Task Write(string text) …和在进行第二个调用之前进行第一个调用(您可能还需要使方法调用也异步:awaitWriteawait Write("First one");await Write("Second one");

慕侠2389804

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;}
打开App,查看更多内容
随时随地看视频慕课网APP