【问题标题】:Accessing Stream at the same time同时访问 Stream
【发布时间】:2011-08-05 01:48:39
【问题描述】:

我正在尝试多次重复使用同一个 Stream。一个用于调整图像大小,另一个用于上传图像。虽然它确实可以调整图像大小,但它似乎锁定了另一种上传文件的方法。我尝试使用 Stream.CopyTo(MemoryStream) 复制 Stream,然后使用它进行上传,但它仍然没有任何不同。

我正在使用 PhotoChooserTask 打开一个流。然后我将 Stream 传递给 ImageThumbnail 方法,该方法创建图像的缩略图,然后将其保存到 IsolatedStorage,如下所示:

    public static void SaveThumbnail(Stream imageStream, string fileName, double imageMaxHeight, double imageMaxWidth)
    {
        var bitmapImage = new BitmapImage();
        bitmapImage.SetSource(imageStream);
        var resizedImage = new WriteableBitmap(bitmapImage);

        using (var isolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            double scaleX = 1;
            using (var fileStream = isolatedStorage.CreateFile(fileName))
            {
                //do stuff for resizing here...
                resizedImage.SaveJpeg(fileStream, newWidth1, newHeight1, 0, 100);
            }
        }
    }

同时,我正在重用来自 PhotoChooserTask 的相同 Stream 来上传图像。要么,它似乎将彼此锁定,并且没有抛出任何错误。

有什么建议吗?

【问题讨论】:

    标签: c# silverlight windows-phone-7


    【解决方案1】:

    您需要copy the stream into a byte array,因为流在​​使用过程中会发生变化并且无法克隆。

    public static void CopyStream(Stream input, Stream output)
    {
        byte[] buffer = new byte[32768];
        while (true)
        {
            int read = input.Read (buffer, 0, buffer.Length);
            if (read <= 0)
                return;
            output.Write (buffer, 0, read);
        }
    }
    

    【讨论】:

    • 该代码是用于 Java 的吗?刚刚尝试在 MSDN 上搜索 ByteArrayOutputStream 类,它是用于 Java 的。不过,如果它是用于 C# 的话会很有帮助。
    • 哎呀,是的,对不起。 C# 也是一样,不过:stackoverflow.com/questions/2490423/…
    • CopyTo 已经是 .net 中流 API 的一部分。我不明白这如何回答最初的问题。
    【解决方案2】:

    复制到 MemoryStream 应该可以解决问题。要重用内存流,您需要通过将 Position 属性设置回 0 来将位置重置回起点。

    【讨论】:

      猜你喜欢
      • 2020-07-23
      • 2020-03-09
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 2020-10-25
      • 2020-11-03
      相关资源
      最近更新 更多