none
stream.OpenReadAsync 异常 RRS feed

  • 问题

  • 有一个静态方法,用来下载并保存网路上的图片。会有多个线程并发调用,用于同时下载多个图片。方法体如下:

    public static async Task<bool> PhotoDownloadAsync(MyMedia media, string folderName, string fileName)
            {
                try
                {
                    Uri uri = new Uri(media.Url);
                    var folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(folderName,
                        CreationCollisionOption.OpenIfExists);
    
                    var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
    
                    RandomAccessStreamReference stream = RandomAccessStreamReference.CreateFromUri(uri);
    
                    using (IRandomAccessStream randomAccessStream = await file.OpenAsync(FileAccessMode.ReadWrite))
                    {
                        Debug.WriteLine("{0} stream open at {1}", media.Url,
                                    DateTime.Now.ToString("HH:mm:ss fff"));
                        Windows.Storage.Streams.Buffer buffer;
                        // 断网之后,能够运行到这里
                        using (IRandomAccessStream originalImageStream = await stream.OpenReadAsync())
                        {// 在这里之后就开始显示调试信息:XXX线程已退出
                         // 没有错误抛出,也没有返回运行结果,感觉就像被kill了
                            buffer = new Windows.Storage.Streams.Buffer((uint) originalImageStream.Size);
                            await
                                originalImageStream.ReadAsync(buffer, (uint) originalImageStream.Size,
                                    InputStreamOptions.None);
                        }
                        
                        await randomAccessStream.WriteAsync(buffer);
                        await randomAccessStream.FlushAsync();
                    }
                    return true;
                }
                catch (Exception ex)
                {
                    return false;
                }
            }

    上面这段代码在有网状态下,运行是没有任何问题的,但是在运行起来之后,突然断网,就会经常无返回值。感觉就好像进程被kill了。经过一下午的跟踪调试,发现是在

    using (IRandomAccessStream originalImageStream = await stream.OpenReadAsync())

     这里开始丢失执行的。

    我希望的结果是能够抛出异常,把下面的逻辑走下去。

    不知道哪位大神碰到过类似情况,给我指点指点。


    别紧张,我不是什么好人。。。

    2014年9月24日 9:57

答案

全部回复