2

我最近在报表查看器(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和)。但是,如果我将其更改为,那么问题就会消失(因为它不再需要该程序集。CurrentUICulturefi-FICurrentUICultureen-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 :)

4

1 回答 1

0

The text in Update 3 actually contains the resolution. At the moment the only solution I know is to change the CurrentUICulture to en-US for the moment when the report control is loading and rendering. This effectively eliminates the 10 minute delay.

于 2012-08-24T06:09:47.913 回答