我正在制作一个应用程序,希望在其中添加外观很酷的打字机效果,而不会使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)
答案 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;
}