2012-11-28 66 views
1

我想在我的構造函數中獲取一個文件夾。所以,我需要一個非異步方法。在CreateFolderAsync期間拋出System.InvalidOperationException

public static Windows.Storage.StorageFolder getStorageImagesDir() 
    { 
     Windows.Storage.StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder.CreateFolderAsync("images", CreationCollisionOption.OpenIfExists).GetResults(); 

     return folder; 
    } 

然而,System.InvalidOperationException被拋出,如果文件夾不首度存在。 (不知怎的,該文件夾仍然被創建,即使拋出異常)

當文件夾已經存在時,該函數可以正常工作。

我可以知道我的代碼有什麼問題嗎?

在Desktop .NET,Java,Python ......中,我們可以使用簡單的一行API調用來執行文件夾創建。例如,.NET中的Directory.CreateDirectory,Java中的File.mkdirs ...因此,爲什麼在Windows應用商店應用中,我們需要以異步方式進行操作?難道它不是簡單的事情不必要的複雜嗎?

回答

2

從MSDN中的某個人獲取代碼。

StorageFolder folder = ApplicationData.Current.LocalFolder.CreateFolderAsync("images", CreationCollisionOption.OpenIfExists) 
           .AsTask() 
           .Result; 
return folder; 
0

問題是你正試圖在構造函數中執行異步操作。構造函數本身不是異步的,因此您可能試圖在實際創建文件夾之前運行操作(GetResults)。

你有兩個選擇:

  1. 您可以創建一個異步方法,並且該方法中等待調用get異步初始化或
  2. 您可以將文件夾碼出來的構造和提供一些顯式初始化。

無論採用哪種方式,對於您將得到的文件夾的唯一有效引用是如果您等待異步操作。否則它將在操作完成之前返回。

+0

我可以知道爲什麼'GetResults'調用可能會產生'System.InvalidOperationException'嗎?我以爲GetResults的意思是,「等到文件夾完成創建,並將結果返回給調用者」? –

+0

和爲什麼我們不能有一個簡單的形式'Directory.CreateDirectory'? http://msdn.microsoft.com/en-us/library/54a0at6s.aspx在我的個人視圖中,不需要將目錄創建爲異步。它使事情變得不必要複雜 –

+0

任何磁盤IO操作都是異步編程的絕佳選擇。磁盤訪問速度非常慢,可能會受到許多其他進程的影響。如果有一個後臺進程將磁盤推到100%的使用率,並且在接下來的五分鐘內會這樣做(想到視頻處理)。如果您的應用完全停止五分鐘,直到文件夾被創建? –

相關問題