我最近在报表查看器(Windows 窗体)中遇到了一个非常奇怪的问题。通常,reportviewer 表现得非常好,加载速度很快,并且很好地显示了报告。但是,我们遇到了一种需要很长时间才能显示报告的情况。我无法发布整个代码,因为不清楚导致问题的原因。
问题
以下方法调用会导致问题(同样,仅在非常特定的情况下):
reportViewer.LocalReport.GetDefaultPageSettings()
应用程序可能需要长达 10 分钟才能通过此行,事实上,如果将此行注释掉,那么一切都会开始正常运行。
special
场景_
导致问题的特殊情况的唯一区别是,在显示报告之前,一些 python 代码在报告显示之前被执行(通过 IronPython 和在同一个 AppDomain 中,python 代码不引用任何接近报告的内容)。
探查器,有人吗?
好的,所以我使用分析器 (Xte) 运行此场景,并注意到该方法IronPython.Runtime.PythonContext.LoadAssemblyFromFile
是冻结的方法。我们正在运行的 python 代码中没有显式的程序集加载,因此这是一个自动程序集加载。
奇怪的部分
所以,我无法理解的奇怪部分是这两件事是如何联系起来的?我查看了GetDefaultPageSettings()
ILSpy 并看到了这个:
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
But again - the mystery still remains - if the CurrentUICulture
is set to fi-FI
and I execute any script via IronPython it will desperately try to load this resources file and fail all the time. If anyone is able to explain this to me - please do :)