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)
使用同步循环,您可以阻止任何其他活动,直到您的代码完成"键入".结果第二次调用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)
| 归档时间: |
|
| 查看次数: |
53 次 |
| 最近记录: |