C# 等待任务。延迟在if函数中表现怪异

C# 等待任务。延迟在if函数中表现怪异,c#,async-await,task,C#,Async Await,Task,所以我尝试在一个富文本框中创建一些文本动画。 我想我可以用定时器来达到同样的效果,也许更好,但是语法有点难理解(我已经编程了50个小时了) 我使用wait Task.Delay方法,但其行为与预期不同 private async void WriteText(string text, int delay) { await Task.Delay(delay); rtbOutput.AppendText(text); } private void b

所以我尝试在一个富文本框中创建一些文本动画。 我想我可以用定时器来达到同样的效果,也许更好,但是语法有点难理解(我已经编程了50个小时了)

我使用wait Task.Delay方法,但其行为与预期不同

private async void WriteText(string text, int delay)
    {
        await Task.Delay(delay);
        rtbOutput.AppendText(text);
    }

private void button1_Click(object sender, EventArgs e)
    {
        WriteText("string 1 \n", 1000);
        WriteText("string 2 \n", 2000);
        WriteText("string 3 \n", 500);
    }
//richTextBox reads
    //    string 3
    //    string 1
    //    string 2
而我希望程序在运行第二个WriteText(“字符串2”)之前等待WriteText(“字符串1”)的预期延迟

程序似乎读取3种方法的速度非常快,并且只在延迟时间执行输出

我可以解决这个问题,bij只需将第一个延迟添加到第二个延迟,它就会表现良好

但后来我尝试了一种if方法

private async void WriteTextChain(string text, int delay, int chain)
    {
        for (int i = 0; i < chain; i++)
        {
            rtbOutput.AppendText(text);
            await Task.Delay(delay);
        }
    }

 private void button2_Click(object sender, EventArgs e)
    {
        WriteTextChain("string 1 \n", 1000, 3);
        WriteTextChain("string 2 \n", 300, 6);
    }
    /* output reads
        string 1
        string 2
        string 2
        string 2
        string 2
        string 1
        string 2
        string 2
        string 1
    */
private async void WriteTextChain(字符串文本、整数延迟、整数链)
{
对于(int i=0;i
这个结果让我大吃一惊,到底发生了什么? 我希望 串2,串2,串2,串1序列


有没有ID有人?

这是因为一旦启动异步函数,特别是返回void,它就会在新的上下文中执行(可以在同一个线程上,但在大多数情况下不是这样)

您需要更改代码:

private async Task WriteTextChain(string text, int delay, int chain)
// returning Task allows you to await call to this function
    {
        for (int i = 0; i < chain; i++)
        {
            rtbOutput.AppendText(text);
            await Task.Delay(delay);
        }
    }

 private async void button2_Click(object sender, EventArgs e)
    {
        await WriteTextChain("string 1 \n", 1000, 3); // await makes execution of next line to wait for this line completion
        await WriteTextChain("string 2 \n", 300, 6);
    }
    /* output reads
        string 1
        string 1
        string 1
        string 1
        string 2
        string 2
        string 2
        string 2
        string 2
    */
专用异步任务WriteTextChain(字符串文本、int延迟、int链)
//返回任务允许您等待调用此函数
{
对于(int i=0;i

TPL库有一段相当长的学习曲线,但请继续尝试。它会变得更好

您需要等待WriteText(…)
。另外,让
WriteText
返回一个
任务
,并将按钮的事件处理程序标记为
async
async void
是一个非常糟糕的主意。请改用
async Task
。您的
按钮2\u单击
需要是
async void
,因为它是一个事件处理程序。但是在top-l之外evel形成了永远不会发生的事件处理程序样式。