我最近在报表查看器(Windows 窗体)中遇到了一个非常奇怪的问题。通常情况下,reportviewer 表现得很好,加载速度很快并且可以很好地显示报告。但是,我们遇到了某个场景,需要很长时间才能显示报告。我无法发布整个代码,因为不清楚导致问题的原因。
问题
以下方法调用会导致问题(同样,仅在非常特定的情况下):
reportViewer.LocalReport.GetDefaultPageSettings()
应用程序最多可能需要 10 分钟才能通过此行,事实上,如果此行被注释掉,那么一切都会开始完美运行。
特殊
场景
导致问题的特殊情况的唯一区别是,在显示报告之前,一些 python 代码在报告显示之前被执行(通过 IronPython 和在同一个 AppDomain 中,python 代码没有引用任何甚至接近于报告)。
Profiler,有人吗?
好的,所以我使用探查器 (Xte) 运行此场景并注意到方法 IronPython.Runtime.PythonContext.LoadAssemblyFromFile
是卡住的方法。我们正在运行的 python 代码中没有显式的程序集加载,因此这是一个自动的程序集加载。
奇怪的部分
所以,我无法理解的奇怪部分是这两件事是如何联系起来的?我查看了 ILSpy 中的 GetDefaultPageSettings()
并看到了这个:
public override ReportPageSettings GetDefaultPageSettings()
{
object syncObject;
Monitor.Enter(syncObject = this.m_syncObject);
ReportPageSettings pageProperties;
try
{
this.EnsureExecutionSession();
pageProperties = this.m_pageProperties;
}
finally
{
Monitor.Exit(syncObject);
}
return pageProperties;
}
而且我只能猜测是导致此方法挂起的锁,但我无法理解执行 python 如何影响此锁。我的意思是,如果我不运行 python 代码,那么这个方法执行得非常好,没有延迟,这是绝对清楚的。
顺便说一句 - 大约之后。 10分钟事出报告。它只锁定 10 分钟,然后正常继续。
关于下一步的建议?
所以,如果有人能给我任何关于我现在应该去那里的信息,我将不胜感激。目前,我正在尝试将案例隔离在一个单独的干净项目中,一旦成功,我将在此处发布。
谢谢!
更新 1:Python 脚本示例
到目前为止,我只得到一条附加信息 - 即使您运行最小脚本也会出现此问题。因此,即使执行脚本 0
(只返回 0)也会出现问题。
更新 2:在单独的域中运行
在单独的域中运行 python 没有帮助。问题仍然存在。
更新 3:涉及 CurrentUICulture!
在我的调试过程中,我注意到在某些时候,在有问题的情况下,AppDomain 尝试并未能解析以下资源程序集:
mscorlib.resources, Version=4.0.0.0, Culture=fi, PublicKeyToken=b77a5c561934e089
mscorlib.resources, Version=4.0.0.0, Culture=fi-FI, PublicKeyToken=b77a5c561934e089
这就是延迟 10 分钟的原因 - 它只是尝试一遍又一遍地加载该程序集(CurrentCulture
和 CurrentUICulture
都设置为 fi-FI
).但是,如果我将 CurrentUICulture
更改为 en-US
,那么问题就会消失(因为它不再需要该程序集。
但同样 - 谜团仍然存在 - 如果 CurrentUICulture
设置为 fi-FI
并且我通过 IronPython 执行任何脚本,它会拼命尝试加载此资源文件并且一直失败。如果有人能够向我解释这个 - 请做:)
最佳答案
更新 3
中的文本实际上包含该决议。目前我知道的唯一解决方案是在加载和呈现报表控件时将 CurrentUICulture
更改为 en-US
。这有效地消除了 10 分钟的延迟。
关于c# - ReportViewer 在 GetDefaultPageSettings() 上锁定了很长一段时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12085904/