保存文件后,Silverlight 应用程序在 Mac 冻结

Silverlight app freezes on Mac when file saved

启动 SaveFileDialog 然后保存数据的非常简单的代码。 打开提示,我可以 select 我保存的地方,它保存文件然后整个 tab/app 冻结。显然在 Windows/IE 上运行良好。有什么建议吗?

private void SavePDFFile()
        {
            var saveFileDialog = new SaveFileDialog
                                     {
                                         DefaultExt = "pdf",
                                         Filter = string.Format("Document(.{0})|*.{0}", "pdf"),
                                         FilterIndex = 1,
                                         DefaultFileName = DateTime.Now.ToString("HHmmMMddyyyy")
                                     };

            var saveClicked = saveFileDialog.ShowDialog();
            if (!saveClicked.HasValue || !saveClicked.Value) return;
            var fileStream = saveFileDialog.OpenFile();

            try
            {
                this.IsBusy = true;
                fileStream.Write(this.PDFData, 0, this.PDFData.Length);
                fileStream.Close();
            }
            catch (Exception ex)
            {
                this.DisplayErrorMessage("Error saving PDF file", ex);
            }
            finally
            {
                this.IsBusy = false;
            }
        }

@katit 我在处理 Silverlight OOB 应用程序时也遇到了这个问题。我的应用程序在 Windows 中运行良好,但在 Mac 中它被冻结了,我必须强制退出才能使用再次。

我实际上是从服务器读取 PDF(存储在字段类型 - 'varbinary')并将其存储到用户的本地计算机。

对我有用的解决方案是分段下载文件块(我使用缓冲区大小 - 1 MB)。

不确定当您的应用程序冻结时您使用的文件大小..但我认为,将 'PDFData' 写入小部分文件流可能会对您有所帮助。

此外,添加 filestream.Flush(); (请参阅下面代码中突出显示的部分)并查看是否有帮助:

private void SavePDFFile()
    {
        var saveFileDialog = new SaveFileDialog
                                 {
                                     DefaultExt = "pdf",
                                     Filter = string.Format("Document(.{0})|*.{0}", "pdf"),
                                     FilterIndex = 1,
                                     DefaultFileName = DateTime.Now.ToString("HHmmMMddyyyy")
                                 };

        var saveClicked = saveFileDialog.ShowDialog();
        if (!saveClicked.HasValue || !saveClicked.Value) return;
        var fileStream = saveFileDialog.OpenFile();

        try
        {
            this.IsBusy = true;
            fileStream.Write(this.PDFData, 0, this.PDFData.Length);
            **filestream.Flush();**
            fileStream.Close();
        }
        catch (Exception ex)
        {
            this.DisplayErrorMessage("Error saving PDF file", ex);
        }
        finally
        {
            this.IsBusy = false;
        }
    }

回答我自己的问题。这与代码本身无关。这是安全问题。为了允许这段代码在 Mac 上执行(而且似乎是新版本的 IE)你需要给它更多的权限。

在 IE 上,您需要将网站添加到受信任的站点列表。

On Mac - 您需要在 "Unsafe" 模式下将 Silverlight 设置为 运行。这是在 Preferences/Security/Silverlight 中,需要 select 网站,按住 "Option" 键,然后打开下拉菜单以查看该选项。找了好久..