如何以阻塞/同步方式下载文件?

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

bdo*_*lan 5

最有可能的是,此代码在UI线程中运行,该线程处理所有Web浏览器与用户的交互.这就是为什么你不会发现任何阻塞操作的原因 - 因为任何阻塞操作都会以与你看到的完全相同的方式冻结UI!更重要的是,如果UI线程也处理网络IO(这是常见的),那么你将在这里死锁,因为你正在等待的异步操作永远不会完成.

我担心你只需要将代码重写为由异步操作驱动的状态机.