我正試圖編寫一個函數來從Windows 8商店應用程序的漫遊文件夾中加載一些數據。什麼是避免Windows庫存異步文件方法期間死鎖的正確方法
我在Load方法的roamingLoad.Wait()上遇到死鎖(掛起);
這樣做的正確方法是什麼?以下是什麼做錯了?
編輯:我應該指出,如果我在調試器中執行它,它可以很好地工作。
有沒有辦法做到這一點,沒有頂級方法成爲異步?如果我這樣做,那麼每個調用方法都必須等待阻止,直到完成否。
public override bool Load(string in_FileNameAndDirectory, StreamTask in_StreamTask, bool in_PreferRoaming)
{
if (PreferRoaming && SupportsRoamingSave)
{
try
{
Task<bool> roamingLoad = RoamingLoadAsync(in_FileNameAndDirectory, in_StreamTask);
roamingLoad.Wait();
return roamingLoad.Result;
}
catch (Exception error)
{
return false;
}
}
return Load(in_FileNameAndDirectory, in_StreamTask);
}
private async Task<bool> RoamingLoadAsync(string inFileNameAndDirectory, StreamTask inStreamTask)
{
try
{
StorageFolder roamingFolder = ApplicationData.Current.RoamingFolder;
StorageFile sampleFile = await roamingFolder.GetFileAsync(inFileNameAndDirectory);
using (Stream stream = await sampleFile.OpenStreamForReadAsync())
inStreamTask(stream);
}
catch (Exception error)
{
return false;
}
return true;
}
你的方法是同步的。你可以使'Load'方法異步,並返回任務。然後繼續執行其餘部分。 – nomail
我試着測試你的代碼,但隨後VS2015編輯器再次陷入僵局,微軟也無法做到這一點。你的代碼會因爲你從未真正開始任務而死鎖。通過首先意識到任何使線程看起來容易的抽象增加了五個新的不可解決的問題,通過使用調試> Windows>任務調試器窗口來診斷停滯的任務,並通過嚴格遵循貨物崇拜的方法來應用充分的幫助,您可以避免這些相當不可避免的和難以糾正的錯誤編碼樣本。異步/等待是一直下降的龜,偏離模式購買痛苦。 –
只是一個側面說明,真的有必要將OpenFreamAsync和inStreamTask分開GetFileAsync嗎?只需將它們包裝成一個任務以避免不必要的上下文切換 – cscmh99