![](/img/trans.png)
[英]How do I check to make sure the customer has done a task before they visit any page
[英]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.