WritingAnimation会冻结用户界面

时间:2018-05-04 19:21:18

标签: c# multithreading winforms

我正在尝试制作一个WritingAnimator,但是当我运行它时会冻结UI ... 这是我做的:

public partial class Tsia : Form
{
    [...]

    private void TypeText()
    {
        WritingAnimator("Some text");
        WritingAnimator("This is another text");
    }

    private void WritingAnimator(string text)
    {
        foreach (char c in text)
        {
            TextBox1.AppendText(c.ToString());
            Thread.Sleep(100);
        }
    }
}

所以我在Google上搜索了一下,我发现了一种避免使用其他线程冻结UI的方法:

public partial class Tsia : Form
{
    [...]

    private void TypeText()
    {
        WritingAnimator("Some text");
        WritingAnimator("This is another text");
    }

    private async void WritingAnimator(string text)
    {
        foreach (char c in text)
        {
            TextBox1.AppendText(c.ToString());
            await Task.Delay(100);
        }
    }
}

但它输入类似于“Some text”和“This is another text”的东西,因为WritingAnimator(“这是另一个文本”);不要等待WritingAnimator的结束(“Some text”); ...

我该如何解决?

1 个答案:

答案 0 :(得分:0)

await
  

“所以我在谷歌搜索,我发现了一种避免冻结用户界面的方法   使用其他线程“

async / Task.Delay C#语言功能,因为版本5和CancellationToken任务并行库的一部分( TPL)即可。整个TPL + async / await功能简化了开发人员对异步的使用。

还有两个想法:

  • 如果用户想要停止动画,也许你想提供一个using (FileStream fs = File.OpenRead(binarySourceFile.Path)) using (BinaryReader reader = new BinaryReader(fs)) { // Read in all pairs. while (reader.BaseStream.Position != reader.BaseStream.Length) { Item item = new Item(); item.UniqueId = reader.ReadString(); item.StringUnique = reader.ReadString(); result.Add(item); } } return result;
  • 对于使用异步修饰符的方法,还有一个naming convention