c# - ReportViewer 在 GetDefaultPageSettings() 上锁定了很长一段时间

标签 c# .net ironpython reportviewer deadlock

我最近在报表查看器(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 分钟的原因 - 它只是尝试一遍又一遍地加载该程序集(CurrentCultureCurrentUICulture 都设置为 fi-FI).但是,如果我将 CurrentUICulture 更改为 en-US,那么问题就会消失(因为它不再需要该程序集。

但同样 - 谜团仍然存在 - 如果 CurrentUICulture 设置为 fi-FI 并且我通过 IronPython 执行任何脚本,它会拼命尝试加载此资源文件并且一直失败。如果有人能够向我解释这个 - 请做:)

最佳答案

更新 3 中的文本实际上包含该决议。目前我知道的唯一解决方案是在加载和呈现报表控件时将 CurrentUICulture 更改为 en-US。这有效地消除了 10 分钟的延迟。

关于c# - ReportViewer 在 GetDefaultPageSettings() 上锁定了很长一段时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12085904/

相关文章:

c# - 从具有未知签名的 MethodInfo 创建表达式函数

.NET 6 Linux 多容器应用程序无法在 Azure 应用服务中建立容器内部通信

c# - 更改 .net (C#) 中 XmlDocument 的 XPath 根目录?

c# - ASP.NET WebApi 未收到发布数据

python - 命名一些使用 IronPython 和 Silverlight 编写的重要站点

python - 算法 Python 用于在 >>> 和 ... 交互式控制台提示之间做出决定?

python - 将 Iron Python 与 Solidworks API 结合使用

c# - C#语言中关于XML序列化的Arrayname

c# - DataGridView header 能否自动调整自身大小?

c# - OpenFileDialog 隐藏预览