【问题标题】:Lots of WPF textboxes on IIS and a Win32Exception: The operation completed successfullyIIS 上有很多 WPF 文本框和 Win32Exception:操作成功完成
【发布时间】:2013-07-29 08:21:07
【问题描述】:

我正在使用 WPF TextBox 在 Web 应用程序中执行服务器端拼写检查。我知道将 PresentationFramework 添加到托管在 IIS 中的 Web 应用程序是一件很糟糕的事情,但我还是这样做了。现在我要付出代价了。

我正在做这样的事情:

var spellCheckTextBox = new TextBox {
   Text = text
};

int errorIndex = spellCheckTextBox.GetNextSpellingErrorCharacterIndex(startPosition, LogicalDirection.Forward);

为此,我必须将 STA 中的方法称为 this article 大纲。

我收到Win32Exception: The operation completed successfully 异常,我认为这是因为我已经超出了进程可以分配的最大句柄数。我在其中分配文本框的方法成功完成,但我感觉底层的 Win32 图形上下文没有被清理。 TextBox 不实现 IDisposable。我如何确保它清理了它使用过的所有资源?

我在想,如果页面关闭时它在 xaml 页面上,Presentation Framework 的内部可能会进行清理,但它没有发生。

如果有人对这里感兴趣的是堆栈跟踪:

[Win32Exception: The operation completed successfully]
    MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d):15
    MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks):479
    System.Windows.Threading.Dispatcher..ctor():136
    System.Windows.Threading.Dispatcher.get_CurrentDispatcher():14
    System.Windows.DependencyObject..ctor():0
    System.Windows.Media.Visual..ctor(ResourceType resourceType):11
    System.Windows.UIElement..ctor():0
    System.Windows.FrameworkElement..ctor():11
    System.Windows.Controls.Control..ctor():0
    System.Windows.Controls.Primitives.TextBoxBase..ctor():0
    System.Windows.Controls.TextBox..ctor():11

我发现其他一些人有类似的问题herehere 我推测它可能与this (although this is old) 有关。似乎在大多数情况下,Win32 图形的东西是leaking or not being cleaned up

【问题讨论】:

  • 我不知道你在说什么。 WPF UI 元素不实现 IDisposable 因为它们不需要,并且您的所有代码都与“图形上下文”无关(无论这意味着什么)。而且 WPF 中没有“最大句柄数”(不管这意味着什么)。如果您希望它能够工作,您需要一个正在运行的System.Windows.Threading.Dispatcher 实例。为此,您必须Dispatcher.Run()
  • @HighCore 在 StaTaskScheduler 上运行时有效。我所指的底层图形上下文是用于绘图的 Win32 方法。我们在另一个创建太多 wpf 图纸的程序中遇到了同样的问题。我已经编辑了这个问题并添加了一些链接到其他有类似问题的人。对不起,如果我的术语不清楚。
  • 对不起,我不想听起来不尊重,但你显然有no idea 你在说什么。所有这些链接都是关于(蹩脚的无用恐龙)winforms 而不是 WPF。 WPF 没有所有这些可怕的限制。并且 WPF 不使用任何 Win32 的东西来“绘制”任何东西。它基于 DirectX。并且 WPF 渲染与控件无关,就像 winforms 中的情况一样,因此您的代码与任何渲染内容无关。此外,WPF UI 元素不使用任何 GDI 句柄,因此所有这些句柄限制在 WPF 中都无关紧要。
  • 您的错误是因为您没有执行 WPF 要求的Dispatcher.Run()
  • @HighCore 如果 WPF 不使用 Win32 绘制任何东西,为什么它在堆栈跟踪中?即使它没有绘制它正在创建的任何东西,似乎也没有得到清理。它在最初的几千次有效,之后我们遇到了问题。

标签: c# wpf iis textbox hwnd


【解决方案1】:

感谢 HighCores cmets,我现在正在调度程序线程上创建文本框,一切正常。对于那些感兴趣的人,有一个存储库here,它使用 WPF 文本框以这种方式进行拼写检查。

【讨论】:

    猜你喜欢
    • 2012-01-17
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多