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