Silverlight 4线程问题

时间:2010-11-17 10:47:09

标签: c# multithreading silverlight events

最近我一直在Silverlight中开发一个使用上传的应用程序。
我使用WebClient类与我服务器中的HttpHandler进行通信。 WebClient提供的方法是异步的,并且使用基于事件的APM:请记住,Silverlight的范围是拥有一个流畅的UI,不会阻止我想要的,有趣的是,尝试使调用同步。

代码

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 个答案:

答案 0 :(得分:5)

Silverlight需要与UI线程会合才能执行Web请求,但是在WaitOne调用中阻止了UI线程,因此您遇到了死锁。 (这可以解释为Silverlight“功能”。)