C# 等待任务。延迟在if函数中表现怪异
所以我尝试在一个富文本框中创建一些文本动画。 我想我可以用定时器来达到同样的效果,也许更好,但是语法有点难理解(我已经编程了50个小时了) 我使用wait Task.Delay方法,但其行为与预期不同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
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形成了永远不会发生的事件处理程序样式。