我知道我在问一个存在的问题。我读了许多有关此的文章,但我仍然感到困惑。也许我的英语水平不够好。
首先是我的代码:
void dovoid1(){
//dosomething
}
void dovoid2(){
//dosomething
}
void dovoid3(){
//dosomething
}
和
void action()
{
dovoid1();
Thread.Sleep(1000);
dovoid2();
Thread.Sleep(1000);
dovoid3();
Thread.Sleep(1000);
action();
}
如您所见,void action()将完成一些任务,并使它们之间处于睡眠状态。之后,它会自我重复。 现在,我要避免Thread.Sleep(),因为它会阻塞UI。所以我尝试使用async / await。
private async void action()
{
dovoid1();
Task.Delay(1000);
dovoid2();
Task.Delay(1000);
dovoid3();
Task.Delay(1000);
action();
}
但是它给了我错误。我不知道何时何地应该使用异步或等待。谢谢!
答案 0 :(得分:1)
您需要等待延迟,以在两次呼叫之间创建所需的时间间隔。在这种情况下等待,直到Task.Delay
完成为止。
此外,如果action()
不是事件处理程序,则它可能应该是async Task
而不是async void
(请参阅why is void async bad?)。
private async Task action()
{
dovoid1();
await Task.Delay(1000);
dovoid2();
await Task.Delay(1000);
dovoid3();
await Task.Delay(1000);
action();
}
答案 1 :(得分:0)
您可以在父函数中使用此方法来不阻塞用户界面
await Task.Run(() => {
// Do lot of work here
});
以您的情况
await Task.Run(() => action());
如果您的操作方法是异步的
async Task action(){}
然后
await Task.Run(async () => await action());
您只需在每个Task上放置await关键字,即可将您的操作方法简单地转换为异步。由于await关键字只能与异步方法一起使用,因此您需要将方法转换为异步。
async Task action()
{
dovoid1();
await Task.Delay(1000);
dovoid2();
await Task.Delay(1000);
dovoid3();
await Task.Delay(1000);
action();
}
请记住,如果您的dovoid1,dovoid2,dovoid3包含Task,那么还需要将它们转换为异步方法并需要等待。