保存文件后,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" 键,然后打开下拉菜单以查看该选项。找了好久..
启动 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" 键,然后打开下拉菜单以查看该选项。找了好久..