我對Async/Await在C# 中的作業方式有很好的理解。
我知道當到達await
關鍵字時,控制權被交還給呼叫函式,這就是異步執行的實作方式(如果我在這里錯了,我希望得到更正和更好的解釋)。
但是,我不確定如何確保異步函式在從函式回傳之前已完成執行。
以下面的例子為例:
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;
}
}
在上面的代碼片段中,我想確保SqLiteAsyncConnection
在我用.db
entry 的內容替換檔案中的資料之前我是關閉的(這樣它就不會出錯)。因此我已經使用了ContinueWith
(如果這是錯誤的,我希望得到一些澄清)。
但我也想確保await SqLiteAsyncConnection.CloseAsync().ContinueWith(x => entry.ExtractToFile(pathToUse, true));
在函式回傳之前完成它的執行。那就是我想確保這個函式不會不準確地回傳真,并且在await SqLiteAsyncConnection.CloseAsync() .ContinueWith(x => entry.ExtractToFile(pathToUse, true));
完成執行之前它不會回傳真。
我如何實作這一目標?
uj5u.com熱心網友回復:
ContinueWith
當你在await
那里時,你不需要。你可以使用ContinueWith
,如果你不使用await
,它可以被看作是一個型別的回呼,一旦父任務已完成/失敗。
await SqLiteAsyncConnection.CloseAsync()
.ContinueWith(x => entry.ExtractToFile(pathToUse, true));
//can be replaced by
await SqLiteAsyncConnection.CloseAsync();
entry.ExtractToFile(pathToUse, true);
當您點擊await
代碼中的某個部分時,您的函式沒有完成,它沒有回傳true
,它在某種意義上被掛起并且控制權回傳給呼叫執行緒。一旦你await
的所有s 在函式中完成,它才會回傳結果。
uj5u.com熱心網友回復:
當到達
await
關鍵字時,控制權回傳給呼叫函式。
我發現這個常用的解釋令人困惑。簡單來說,異步方法的作業是創建一個Task
. 這就是您呼叫該方法以獲取Task
回報的原因。Task
當await
在此方法中到達第一個1時,您會得到這個。此時異步操作已經開始,(一般)還沒有完成。呼叫者已收到Task
表示異步操作的 ,并且可以在操作進行中時繼續做其他事情。在某些情況下,呼叫者沒有什么比等待異步操作完成更好的事情要做,在這種情況下,您會看到以下模式:
await LoadDataIntoLocalAppFile();
這里呼叫者本身就是一個異步方法。我們知道它是因為await
關鍵字。上面的代碼等價于:
Task task = LoadDataIntoLocalAppFile();
await task;
當到達第一個await
里面時,第一行將完成LoadDataIntoLocalAppFile
。當里面的最后一行代碼LoadDataIntoLocalAppFile
運行時,第二行將完成。
1更準確地說,第await
一個未完成的等待。
uj5u.com熱心網友回復:
你對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(...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/389231.html
下一篇:返回列表