为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
一只甜甜圈 2022-09-04 16:41:26
我正在制作一个应用程序,我想在其中添加一个看起来很酷的打字机效果,而不会让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)
查看完整描述

2 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

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


据推测,在版本中,您可以同时启动两个调用并让它们并行运行 - 实际上它们会同时键入字符。asyncWrite


修复:退货WriteTask


private async Task Write(string text) …

和在进行第二个调用之前进行第一个调用(您可能还需要使方法调用也异步:awaitWrite


await Write("First one");

await Write("Second one");


查看完整回答
反对 回复 2022-09-04
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

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;

}


查看完整回答
反对 回复 2022-09-04
  • 2 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号