Silverlight 4 Threading Проблемы - PullRequest
       0

Silverlight 4 Threading Проблемы

1 голос
/ 17 ноября 2010

недавно я разрабатывал приложение в Silverlight, которое использует загрузку.
Я использую класс WebClient для связи с HttpHandler, который находится на моем сервере. Методы, предоставляемые WebClient, являются асинхронными и используют основанный на событиях APM: имея в виду, что цель Silverlight состоит в том, чтобы иметь гибкий пользовательский интерфейс, который не блокирует, как мне хотелось бы, ради удовольствия, попытаться сделать вызовы синхронными.

код

AutoResetEvent _uploadedEvent = new AutoResetEvent(false);

foreach (var item in _fileInfos)
        {
            WebClient client = new WebClient();

            client.OpenWriteCompleted += (sender, e) =>
            {
                try
                {
                    using (FileStream fs = item.OpenRead())
                    using (Stream stream = y.Result)
                    {
                        while (true)
                        {
                            byte[] buffer = new byte[8192];

                            int readBytes = fs.Read(buffer, 0, buffer.Length);
                            if (readBytes == 0)
                                break;

                            stream.Write(buffer, 0, readBytes);
                        }
                    }
                }
                finally
                {
                    _uploadedEvent.Set();
                }
            };

            client.OpenWriteAsync(new Uri(_receiverUri));

            _uploadedEvent.WaitOne();
        }

Проблема

Этот способ сделать синхронные вызовы не работает в Silverlight, но работает в WPF. Сейчас я замечаю, что у меня не одна такая проблема: https://stackoverflow.com/questions/3819650/silverlight-httprequest-thread-problem

Как вы думаете, в чем проблема?

Заранее спасибо.
AS-CII.

1 Ответ

5 голосов
/ 17 ноября 2010

Silverlight необходимо выполнить рандеву с потоком пользовательского интерфейса для выполнения веб-запроса, но поток пользовательского интерфейса заблокирован при вызове WaitOne, поэтому у вас есть тупик. (Это может быть истолковано как «особенность» Silverlight.)

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