Доступ к потоку в то же время - PullRequest
2 голосов
/ 04 августа 2011

Я пытаюсь использовать один и тот же поток несколько раз. Один для изменения размера изображения, а другой для загрузки изображения. Несмотря на то, что он работает для изменения размера изображения, он, похоже, блокирует другой метод загрузки файла. Я попытался скопировать поток с помощью Stream.CopyTo (MemoryStream), а затем использовать его для загрузки, но он все равно не изменился.

Я открываю поток с помощью 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 для загрузки изображения. Иными словами, кажется, что он блокирует друг друга, и не выдается никакой ошибки.

Любые советы?

Ответы [ 2 ]

4 голосов
/ 04 августа 2011

Вам необходимо скопировать поток в байтовый массив , потому что потоки изменяются во время использования и не могут быть клонированы.

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);
    }
}
1 голос
/ 04 августа 2011

Копирование в MemoryStream должно помочь. Чтобы повторно использовать поток памяти, необходимо сбросить позицию обратно в начало, установив для свойства Position значение 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...