2014-09-19 55 views
0

我有2種方法具有相同的功能:InMemoryRandomAccessStream不正確的行爲

private static async Task<IRandomAccessStream> _DownloadImage(string url) 
{ 
    HttpClient http = new HttpClient(); 
    var httpStream = await http.GetStreamAsync(url); 
    var memStream = new MemoryStream(); 
    await httpStream.CopyToAsync(memStream); 
    memStream.Seek(0, SeekOrigin.Begin); 
    return memStream.AsRandomAccessStream(); 
} 

private static async Task<IRandomAccessStream> _DownloadImage2(string url) 
{ 
    HttpClient http = new HttpClient(); 
    var httpStream = await http.GetStreamAsync(url); 
    var stream = new InMemoryRandomAccessStream(); 
    await httpStream.CopyToAsync(stream.AsStreamForWrite()); 
    stream.Seek(0); 
    return stream; 
} 

的問題是,對於某些URL第二版本給一個零長度stream。這是一個錯誤還是我錯過了什麼? 的URL,它的第一個版本給人以圖片的普通流,而第二個是空的:http://icdn.lenta.ru/images/2014/09/17/10/20140917102331786/pic_ffa73ea27023b3e69b6cef4d068c0499.jpg

UPD:

我發現具有低於16384大小的文件都處於危險之中。我在AsStreamForWrite文檔中找到了這個16384的值。 @Kiewic,也提出了一個解決方法。不過,我想知道爲什麼它不起作用。

UPD2: 在Connect中創建bug report

+0

語言投影的AsStreamForWrite()是相當難看。 WinRT流與.NET流不太匹配,因此需要大量代碼來描述差異。許多特殊情況下處理不同種類的流,還有一些代碼隱藏了早期電話版本中的差異。太多的移動部件,錯誤是一個很大的可能性。你不應該這樣寫代碼,使用BitmapSource.SetSourceAsync()是非常重要的,以避免咀嚼大量的內存。最好堅持使用代碼:) – 2014-09-20 09:58:16

+0

@HansPassant,我無法在非UI線程中創建BitmapImage。 – ixSci 2014-09-21 03:51:25

+0

只要相信:你不需要一個答案。盡你所能避免使用所有這些助手將Windows運行時類型轉換爲.NET類。如果你想知道爲什麼,只要閱讀[this thread](http://social.msdn.microsoft.com/Forums/windowsapps/en-US/37ac0ed7-1884-4251-9914-07fae6467b98/mediastreamsource-not-working-正確的在Windows電話81)從結束開始。如果您只是放棄將Windows Runtime轉換爲.NET,您將避免包括隨機OutOfMemoryExceptions在內的大量問題。 – Alovchin 2014-09-22 13:57:07

回答

1

當你保持Stream在一個變量,它的工作原理,嘗試:

// using System.Net.Http; 

private static async Task<IRandomAccessStream> _DownloadImage2(string url) 
{ 
    HttpClient http = new HttpClient(); 
    var httpStream = await http.GetStreamAsync(url); 
    var stream = new InMemoryRandomAccessStream(); 

    Stream streamForWrite = stream.AsStreamForWrite(); 
    await httpStream.CopyToAsync(streamForWrite); 

    stream.Seek(0); 
    Debug.WriteLine("Length: " + streamForWrite.Length); 
    Debug.WriteLine("Size: " + stream.Size); 

    return stream; 
} 
+0

這確實有幫助。但它並沒有回答爲什麼基本版本不起作用。請看看更新後的帖子 – ixSci 2014-09-20 06:45:53