1

我寫一個文件IsolatedStorageFile與異步調用對WriteAsync的異步調用,我如何知道它什麼時候完成?

async void Base64ToImage() 
{ 
    byte[] data; 
    using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) 
    { 
    using (IsolatedStorageFileStream isfs = isf.OpenFile("image.p64", FileMode.Open, FileAccess.ReadWrite)) 
     { 
     data = new byte[isfs.Length]; 
     isfs.Read(data, 0, data.Length); 
     isfs.Close(); 
     } 

    using (IsolatedStorageFileStream stream = isf.OpenFile("newReConvertedFile.png", FileMode.Create)) 
    { 
     await stream.WriteAsync(data, 0, data.Length); 

///////////////////The problem is here, how would i know when WriteAsync is complete to then fire the reload method? 
     //reLoadFile(); 
     } 
    } 
} 

我需要知道什麼時候WriteAsync完成重新加載另一種方法,文件,如何將我去這樣做?

編輯:

其實我的第一個想法是將文件保存到isostorage然後孫中山圖像URI該文件,但不能設置URI來isostorage爲圖像或至少我不能去顯示

我最初的想法是等待方法調用重新加載文件,但我得到一個錯誤「???不返回任務,不能等待。考慮改變它返回「,但我不知道如何去做這件事。

這裏的想法是將幾個圖像轉換爲Base64(SQLite數據庫),但只加載所選的,以顯示。

的reLoadFile方法如下

async void reLoadFile() 
{ 
    byte[] newFile; 
    using (IsolatedStorageFile newFileLoc = IsolatedStorageFile.GetUserStoreForApplication()) 
    { 
     using (IsolatedStorageFileStream newFileStream = newFileLoc.OpenFile("newReConvertedFile.png", FileMode.Open, FileAccess.ReadWrite)) 
     { 
      newFile = new byte[newFileStream.Length]; 
      newFileStream.Read(newFile, 0, newFile.Length); 
      newFileStream.Close(); 

      var ms = new MemoryStream(newFile); 
      var image = new BitmapImage(); 
      image.SetSource(ms); 
      theImage.Source = image; 
     } 
    } 
} 

我一直在尋找的職位,但我不能罰款的方式來得到它的工作,因爲如果我把它馬上我得到一個異常。 我需要做的是打開文件將其從base64轉換爲.png,然後在保存後加載.png文件。 如果有人能幫助我,我將不勝感激。

感謝鮑勃。

+0

我不明白爲什麼這個問題是下投了反對票。它提供了回答這個問題所需的所有細節。 – vcsjones

+0

你不應該使用異步無效,改變你的方法,以異步任務 –

+0

@vcsjones我也不明白它... –

回答

3

1)reloadFile並不需要是async你只需要使用,當你使用await關鍵字

2)BaseTo64Image需要被聲明爲async Task Base64ToImage()裏面的方法,否則的Base64ToImage()呼叫者將無法告訴它什麼時候結束。

3)isfs.Read(data, 0, data.Length);是壞的,只是因爲你要求data.Length字節並不意味着你會得到data.Length閱讀,您需要檢查int閱讀回報和循環或使用CopyTo(Stream)複製到另一個流。

4)(實際回答你的問題)關鍵字await將停止處理函數並等待函數完成。當您點擊await關鍵字時,您的Base64ToImage()函數將返回該函數,代表該函數中其餘代碼的Task,這取決於您對函數返回的Task的處理。

這裏是你的代碼的簡化版本,使用所有的建議

​​

但是,如果這是你在做什麼,而你只是用newReConvertedFile.png作爲臨時文件,您可以簡化您的代碼

async Task Base64ToImage() 
{ 
    using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) 
    using (IsolatedStorageFileStream isfs = isf.OpenFile("image.p64", FileMode.Open, FileAccess.ReadWrite)) 
    { 
     var ms = new MemoryStream(); 
     var image = new BitmapImage(); 
     await isfs.CopyToAsync(ms); 

     ms.Position = 0; 
     image.SetSource(ms); 
     theImage.Source = image; 
    }  
} 
+0

即時通訊不知道我明白你,也許你可以告訴我一個例子? –

+0

在ReloadFile調用我在這裏得到一個錯誤: var ms = new MemoryStream(newFileStream.Length); 關於你的建議,以進一步簡化,我試圖保存它有一個參考它應該應用墓碑,你覺得怎麼樣? –

+0

如果您不告訴我錯誤是什麼,並且爲什麼保存錯誤,那麼您無法真正幫助您解決錯誤,除了第二次讀取它之外,您正在製作一份文件的副本,然後不進行任何操作。除非你有排除的代碼。 –

1

只需在下一行中調用它即可。等待將異步等待,直到WriteAsync完成。這就是「異步/等待」的美妙之處,它允許您編寫看起來同步的異步代碼。

using (IsolatedStorageFileStream stream = isf.OpenFile("newReConvertedFile.png", FileMode.Create)) 
{ 
    await stream.WriteAsync(data, 0, data.Length); 
    reLoadFile(); 
    } 

我錯過了什麼嗎?

+0

我試過,但我得到一個異常,我認爲該文件可能仍然沒有保存或仍然被訪問那時候? –

+0

@BobMachine只需在using語句後移動'reLoadFile'調用並檢查。這應該解決你的問題 –

+0

移動它使用,絕對是問題的一部分,謝謝 –

1

WriteAsync方法在返回的Task完成時完成。

等待任務完成,只是await它:

await stream.WriteAsync(data, 0, data.Length); 
// WriteAsync is complete. 
相關問題