我有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