簡體   English   中英

異步等待匿名方法

[英]async await on anonamous methods

這有效

Task <string> t = Task <string> .Factory.StartNew(() => {
    return "test";
});

但是,如果我將其更改為以下給出的錯誤,為什么呢?

Task <string> t = Task <string> .Factory.StartNew(asyc() => {
    await Thread.sleep(10000);
    return "test";
});

出現此問題的原因是async方法不會返回string而是返回Task<string> 因此,函數的正確返回值為Task<Task<string>> 請注意,一旦創建內部任務,外部任務將被標記為已完成,從那時起,您將必須等待內部任務。

我建議您不要使用Task.Factory.StartNew ,而Task.Run使用Task.Factory.StartNew ,因為此函數具有正確處理async內部函數並解包任務的重載。 使用Task.Run是一個好主意,因為您很少需要TaskTask.Factory.StartNew那樣創建。

因此,我建議您將代碼更改為:

Task<string> t = Task.Run(async () =>
    {
        await Task.Delay(10000);
        return "test";
    });

但是,如果您確定要使用Task.Factory.StartNew ,則可以使用以下命令:

Task<Task<string>> t = Task.Factory.StartNew(async () =>
    {
        await Task.Delay(10000);
        return "test";
    });

編輯:剛剛發現您錯誤地使用Thread.Sleep 您需要返回Task來等待它(或等待對象)。

延遲執行該功能的函數是Task.Delay 這為您提供了可以等待的Task ,該Task將在設定的時間后完成。

暫無
暫無

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

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