最近我一直在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。
答案 0 :(得分:5)
Silverlight需要与UI线程会合才能执行Web请求,但是在WaitOne调用中阻止了UI线程,因此您遇到了死锁。 (这可以解释为Silverlight“功能”。)