Чтение из потока в Windows Phone7 - PullRequest
0 голосов
/ 28 августа 2011

Я работаю с Windows Phone SDK 7 и пытаюсь осуществить загрузку файла изображения.Я не могу использовать стандартный объект BitmapImage, потому что мой сервер использует файлы cookie для проверки подлинности с помощью форм, и я, насколько я могу судить, не могу передать элемент управления браузера или объект BitmapImage в контейнер cookie ... (кстати, если есть способдля этого я тоже хотел бы знать - это сделает мой код намного проще!).

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

Howerver

    _clientData.BeginRead(_buffer, _currentPosition, _buffer.Length, new AsyncCallback(ReadCallback), null);

Возвращает ошибку:

    Specified argument was out of the range of valid values.
    Parameter name: count
       at MS.Internal.InternalNetworkStream.BeginRead(Byte[] buffer, Int32 offset, Int32 count,         AsyncCallback callback, Object state)
       at TestCode.ItemViewModel.ReadImageByChunks()
       at TestCode.ItemViewModel.ReadCallback(IAsyncResult ar)
       at MS.Internal.InternalNetworkStream.StreamAsyncResult.Complete(Int32 bytesProcessed,         Boolean synchronously, Exception error)
       at MS.Internal.InternalNetworkStream.ReadOperation(Object state)
       at MS.Internal.InternalNetworkStream.BeginRead(Byte[] buffer, Int32 offset, Int32 count,         AsyncCallback callback, Object state)
       at TestCode.ItemViewModel.ReadImageByChunks()
       at TestCode.ItemViewModel.<>c__DisplayClassb.<LoadImageFromServer>b__a(IAsyncResult rspAR)
       at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2)
       at System.Threading.ThreadPool.WorkItem.doWork(Object o)
       at System.Threading.Timer.ring()

Это не происходит в первый раз через код (когда clientData.Position == 0).Второй раз через него всегда выбрасывается (когда clientData.Position == 4096).

количество равно _buffer.Length.

    private void ReadImageByChunks()
    {
        try
        {
            _clientData.BeginRead(_buffer, _currentPosition, _buffer.Length, new AsyncCallback(ReadCallback), null);

        }
        catch (Exception error)
        {
            int i = 1; 
        }
    }

    private void ReadCallback(IAsyncResult ar)
    {
        try
        {
            int bytesRead = _clientData.EndRead(ar);

            if (bytesRead > 0)
            {
                _imageStream.Write(_buffer, _currentPosition, bytesRead);
                _currentPosition = _currentPosition + bytesRead;
            }

            if (bytesRead == _buffer.Length)
                ReadImageByChunks();
            else
            {
                //do stuff 
            }
        }
        catch (Exception error)
        {
            int i = 1;
        }
    }

Теперь я несколько раз переписывал этот код, основываясь на собственной интуиции и на коде, найденном в Интернете (но ни один из них не относится к Windows Phone 7).Версия выше смоделирована на этом посте.Но пока не повезло.Любая помощь будет оценена.

1 Ответ

2 голосов
/ 28 августа 2011

Не передавайте индекс в BeginRead, так как он ссылается на индекс буфера , в который нужно начать запись. В настоящее время вы просите записать в буфер аутсайдера его границы.

Замените _currentPosition на 0, и это должно решить проблему. На самом деле вам вообще не нужно отслеживать _currentPosition, поскольку потоки сохраняют свое собственное состояние.

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