簡體   English   中英

如何使用異步/等待來延遲任務而不阻塞UI

[英]How to use async/await to delay task without blocking UI

我知道我在問一個存在的問題。 我讀了許多有關此的文章,但我仍然感到困惑。 也許我的英語水平不夠好。

首先是我的代碼:

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。 所以我嘗試使用異步/等待。

private async void action()
        {

            dovoid1();
            Task.Delay(1000);
            dovoid2();
            Task.Delay(1000);
            dovoid3();
            Task.Delay(1000);
            action();
        }

但這給了我錯誤。 我不知道何時何地應該使用異步或等待。 謝謝!

您需要等待延遲以在兩次呼叫之間創建所需的時間間隔。 在此上下文中等待產生控制權,直到Task.Delay完成。

另外,如果action()不是事件處理程序,則它可能應該是async Task而不是async void (請參見為什么void異步不好? )。

private async Task action()
{
    dovoid1();
    await Task.Delay(1000);
    dovoid2();
    await Task.Delay(1000);
    dovoid3();
    await Task.Delay(1000);
    action();
}

您可以在父函數中使用此方法來不阻塞用戶界面

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,則還需要將它們轉換為異步方法並等待它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM