2014-09-19 45 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