|
1
6
我运行了一个小测试来调用一个动作委托并在其中抛出一个异常。然后,我要确保不会通过一次只运行指定数量的线程来释放线程池,并在删除调用结束时继续填充线程池。代码如下:
在让它运行大约20分钟和超过3000万次BeginInvoke调用之后,私有字节内存消耗和句柄计数是恒定的(23MB)。似乎没有泄漏。我读过杰弗里·里克特的书C通过clr,他说有内存泄漏。至少在.NET 3.5 SP1中似乎不再是这样。 测试环境: Windows 7 x86 .NET 3.5 SP1 Intel 6600双核2.4 GHz 你的, 阿洛伊斯克劳斯 |
|
|
2
11
它当前是否泄漏内存不是您应该依赖的。框架团队将来可能会以一种可能导致泄漏的方式改变事情,因为官方政策是“你必须称之为endinvoke”,那么它就是“按设计”。 你真的想冒险在将来某个时候你的应用会突然开始泄漏内存,因为你选择依赖观察到的行为而不是文档化的需求吗? |
|
|
3
2
在某些情况下,BeginInvoke不需要EndInvoke(尤其是在WinForms窗口消息传递中)。但是,在某些情况下,这很重要——比如异步通信的beginread和endread。如果你想生火而忘了贝金华,你可能会在一段时间后陷入严重的记忆障碍。 所以,你的一个测试不可能是决定性的。您需要处理许多不同类型的异步事件委托才能正确处理您的问题。 |
|
|
4
1
考虑下面的例子,它在我的机器上运行了几分钟,在我决定杀死它之前达到了3.5GB的工作集。
注意:确保在没有附加调试程序的情况下运行它,或者禁用了“引发异常时中断”和“用户未处理异常时中断”。 编辑: 正如Jeff指出的那样,这里的内存问题不是泄漏,而是一个简单的情况,即通过排队来压倒系统的工作速度超过了它的处理速度。事实上,同样的行为可以通过用任何适当的长时间操作来代替投掷来观察。如果在BeginInvoke调用之间留出足够的时间,那么内存使用是有限制的。 从技术上讲,这使得最初的问题没有答案。但是,不管它是否会导致泄漏,不要调用delegate.endinvoke是一个坏主意,因为它会导致忽略异常。 |
|
|
Jess The Witch · GCP云功能中处理延迟任务的模式 1 年前 |
|
Plup · 连接失败时,PyMongo异步客户端未引发异常 1 年前 |
|
|
user1233894 · 尝试从全局函数传递值 1 年前 |
|
|
Fabiano Taioli · 管理单线程Rust中的阻塞函数 1 年前 |
|
|
river7816 · 为什么spdlog不在async函数中打印 1 年前 |