我有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。
語言投影的AsStreamForWrite()是相當難看。 WinRT流與.NET流不太匹配,因此需要大量代碼來描述差異。許多特殊情況下處理不同種類的流,還有一些代碼隱藏了早期電話版本中的差異。太多的移動部件,錯誤是一個很大的可能性。你不應該這樣寫代碼,使用BitmapSource.SetSourceAsync()是非常重要的,以避免咀嚼大量的內存。最好堅持使用代碼:) – 2014-09-20 09:58:16
@HansPassant,我無法在非UI線程中創建BitmapImage。 – ixSci 2014-09-21 03:51:25
只要相信:你不需要一個答案。盡你所能避免使用所有這些助手將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