Ear*_*rlz 2 c# silverlight events webclient blocking
我对silverlight很新,并且非常惊讶地发现只能进行异步文件下载.好吧,我试图通过设置一个标志并等待它改变来反击这一点.这是我的简单代码
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
WebClient webClient = new WebClient();
webClient.DownloadProgressChanged +=
new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);
webClient.OpenReadAsync(new Uri("/trunk/internal/SilverLightInterface.ashx?xxid=XXX", UriKind.Relative));
while (XmlStateStream == null) { }
lblProgress.Content = "Done Loading";
}
void webClient_DownloadProgressChanged(object sender,
DownloadProgressChangedEventArgs e) {
lblProgress.Content = "Downloading " + e.ProgressPercentage + "%";
}
volatile Stream XmlStateStream = null;
void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
if (e.Error != null)
{
lblProgress.Content = "Error: " + e.Error.Message;
return;
}
XmlStateStream = e.Result;
}
Run Code Online (Sandbox Code Playgroud)
这导致Firefox实际冻结(这在我开发时正在做其他事情时非常烦人)(顺便说一下,对firefox的称赞导致我测试它并且firefox冻结了,但是我没有丢失我在恢复后输入的内容)
我不明白为什么while(XmlStateStream==null){}
导致冻结.是否存在锁或易失性的某些属性(除了我已有的属性)或者我是否处于Silverlight页面生命周期的错误部分?
我真的很困惑为什么这不起作用.
此外,这是silverlight 3.0
最有可能的是,此代码在UI线程中运行,该线程处理所有Web浏览器与用户的交互.这就是为什么你不会发现任何阻塞操作的原因 - 因为任何阻塞操作都会以与你看到的完全相同的方式冻结UI!更重要的是,如果UI线程也处理网络IO(这是常见的),那么你将在这里死锁,因为你正在等待的异步操作永远不会完成.
我担心你只需要将代码重写为由异步操作驱动的状态机.