簡體   English   中英

如何確保在從 function 返回之前完成任務?

[英]How to make sure a task is done before returning from a function?

我對Async/ Await 在C#中的工作方式有相當的了解。

我知道,當達到await關鍵字時,控制權將交還給調用 function ,這就是實現異步執行的方式(如果我在這里錯了,我會很感激更正和更好的解釋)。

但是,我不確定如何確保異步 function 在從 function 返回之前完成執行。

舉個例子:

private static async Task<bool> LoadDataIntoLocalAppFile(ZipArchiveEntry entry, string key)
{
    try
    {
        /* SqLiteAsyncConnection is an instance variable in the class that has this function.*/
        string pathToUse = "localDatabase.db"
        if (SqLiteAsyncConnection != null)
        {
            await SqLiteAsyncConnection.CloseAsync()
                .ContinueWith(x => entry.ExtractToFile(pathToUse, true));
        }
        else
        {
            entry.ExtractToFile(pathToUse, true);
        }
        return true;
    }
    catch (Exception ex)
    {
        Colsole.WriteLine(ex.ToString());
        return false;
    }
}

在上面的代碼片段中,我想確保在將.db文件中的數據替換為 entry 的內容之前關閉我的SqLiteAsyncConnection (這樣它就不會出錯)。 因此,我使用了ContinueWith (如果這是錯誤的,我將不勝感激)。

但我也想確保await SqLiteAsyncConnection.CloseAsync().ContinueWith(x => entry.ExtractToFile(pathToUse, true)); 在 function 返回之前完成其執行。 那就是我想確保這個 function 不會不准確地返回 true,並且在await SqLiteAsyncConnection.CloseAsync().ContinueWith(x => entry.ExtractToFile(pathToUse, true)); 完成其執行。

我如何實現這一目標?

你對 async/await 的理解是錯誤的,等待異步調用就夠了:

private static async Task<bool> LoadDataIntoLocalAppFile(ZipArchiveEntry entry, string key)
{
    try
    {
        string pathToUse = "localDatabase.db"
        
        await SqLiteAsyncConnection?.CloseAsync();
        entry.ExtractToFile(pathToUse, true);
        
        return true;
    }
    catch (Exception ex)
    {
        Colsole.WriteLine(ex.ToString());
        return false;
    }
}

然后調用:

await LoadDataIntoLocalAppFile(...

當您在那里await時,您不需要ContinueWith 如果您不使用await ,您將使用ContinueWith ,一旦父任務完成/失敗,它可以被視為一種回調類型。

await SqLiteAsyncConnection.CloseAsync()
                .ContinueWith(x => entry.ExtractToFile(pathToUse, true));

//can be replaced by

await SqLiteAsyncConnection.CloseAsync();
entry.ExtractToFile(pathToUse, true);

當您在代碼中點擊await部分時,您的 function 沒有完成,它沒有返回true ,它在某種意義上被掛起,並且控制權返回給調用線程。 在 function 中完成所有await后,它才會返回結果。

當到達await關鍵字時,控制權被交還給調用 function。

我發現這個常用的解釋令人困惑。 簡單來說,異步方法的工作是創建一個Task 這就是您調用該方法以獲取Task的原因。 在此方法中達到第一個¹ await時,您將獲得此Task 此時異步操作已經開始,並且(通常)還沒有完成。 調用者已收到代表異步操作的Task ,並且可以在操作進行中時繼續做其他事情。 在某些情況下,調用者沒有什么比等待異步操作完成更好的事情了,在這種情況下,您會看到以下模式:

await LoadDataIntoLocalAppFile();

這里調用者本身就是一個異步方法。 我們知道它是因為await關鍵字。 上面的代碼與此等價:

Task task = LoadDataIntoLocalAppFile();
await task;

當到達LoadDataIntoLocalAppFile中的第一個await時,第一行將完成。 LoadDataIntoLocalAppFile中的最后一行代碼運行后,第二行將完成。

¹更准確地說,是未完成的可等待對象的第一次await

暫無
暫無

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

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