C# Silverlight 4线程问题

C# Silverlight 4线程问题,c#,multithreading,silverlight,events,C#,Multithreading,Silverlight,Events,最近,我在Silverlight中开发了一个使用上传的应用程序 我使用WebClient类与服务器中的HttpHandler通信。WebClient提供的方法是异步的,并使用基于事件的APM:请记住,Silverlight的范围是提供一个流畅的UI,它不会阻塞我想要的,为了好玩,我尝试同步调用 密码 问题 这种使调用同步的方法在Silverlight中不起作用,但在WPF中起作用。 现在我注意到我不是唯一一个有这个问题的人: 你认为问题出在哪里 提前感谢。 AS-CII。Silverlight需

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

密码 问题 这种使调用同步的方法在Silverlight中不起作用,但在WPF中起作用。 现在我注意到我不是唯一一个有这个问题的人:

你认为问题出在哪里

提前感谢。

AS-CII。

Silverlight需要与UI线程会合以执行web请求,但UI线程在WaitOne调用中被阻塞,因此出现死锁。(这可以解释为Silverlight的“功能”。

Silverlight需要与UI线程会合才能执行web请求,但UI线程在WaitOne调用时被阻止,因此出现死锁。(这可以理解为Silverlight的“功能”)

为了好玩,我想尝试同步通话。我不觉得这有什么好玩的。我认为这是一种练习和了解更好Silverlight的方法。这是问题吗?请尝试从代码中删除此
线程池.QueueUserWorkItem
,并直接调用
OpenWriteAsync
,这是不需要的。调用OpenWriteAsync时,它将已经使用池中的线程。另外,我敢打赌,当您尝试访问
e.Result
时,您的回调中会发生异常,而您实际上从未设置过该事件。使用try/finally确保事件已被设置,否则您将关闭较差的浏览器,等待主线程中从未发出信号的事件:-)已尝试。它不起作用,我使用线程池是因为我认为Silverlight没有使用新线程。也没有例外,调试器不会进入OpenWriteCompleted事件,如果我删除对WaitOne的调用,一切都会正常工作。至于为什么这在WPF而不是Silverlight中工作,很难说。需要记住的一点是Silverlight在沙盒环境中运行,您可能没有跨域的HTTP访问权限。为了好玩,我想尝试同步调用。我不觉得这有什么好玩的。我认为这是一种练习和了解更好Silverlight的方法。这是问题吗?请尝试从代码中删除此
线程池.QueueUserWorkItem
,并直接调用
OpenWriteAsync
,这是不需要的。调用OpenWriteAsync时,它将已经使用池中的线程。另外,我敢打赌,当您尝试访问
e.Result
时,您的回调中会发生异常,而您实际上从未设置过该事件。使用try/finally确保事件已被设置,否则您将关闭较差的浏览器,等待主线程中从未发出信号的事件:-)已尝试。它不起作用,我使用线程池是因为我认为Silverlight没有使用新线程。也没有例外,调试器不会进入OpenWriteCompleted事件,如果我删除对WaitOne的调用,一切都会正常工作。至于为什么这在WPF而不是Silverlight中工作,很难说。需要记住的一点是,Silverlight在沙盒环境中运行,您可能没有跨域的HTTP访问权限。
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();
        }