【发布时间】: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
我发现其他一些人有类似的问题here 和here 我推测它可能与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 绘制任何东西,为什么它在堆栈跟踪中?即使它没有绘制它正在创建的任何东西,似乎也没有得到清理。它在最初的几千次有效,之后我们遇到了问题。