- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 gui 应用程序,它定期显示 cpu 负载。负载由 StateReader 类读取:
public class StateReader
{
ManagementObjectSearcher searcher;
public StateReader()
{
ManagementScope scope = new ManagementScope("\\\\localhost\\root\\cimv2");
ObjectQuery query = new ObjectQuery("select Name,PercentProcessorTime from Win32_PerfFormattedData_PerfOS_Processor where not Name='_Total'");
searcher = new ManagementObjectSearcher(scope, query);
}
// give the maximum load over all cores
public UInt64 CPULoad()
{
List<UInt64> list = new List<UInt64>();
ManagementObjectCollection results = searcher.Get();
foreach (ManagementObject result in results)
{
list.Add((UInt64)result.Properties["PercentProcessorTime"].Value);
}
return list.Max();
}
}
GUI 使用响应式扩展更新:
var gui = new GUI();
var reader = new StateReader();
var sub = Observable.Interval(TimeSpan.FromSeconds(0.5))
.Select(_ => reader.CPULoad())
.ObserveOn(gui)
.Subscribe(gui.ShowCPUState);
Application.Run(gui);
sub.Dispose();
现在当我退出我的应用程序时,我收到一条错误消息
RaceOnRCWCleanup was detected.
An attempt has been mad to free an RCW that is in use. The RCW is use on the
active thread or another thread. Attempting to free an in-use RCW can cause
corruption or data loss.
如果我不读取 cpu 负载,则不会出现此错误,而只是提供一些随机值,因此错误以某种方式与读取负载有关。此外,如果我在 Application.Run(gui)
之后放置一个断点并在那里稍等片刻,错误似乎不会经常出现。
据此和我的谷歌搜索,我认为使用管理命名空间中的类会创建一个后台线程,该线程引用包装在运行时可调用包装器中的 COM 对象,当我退出我的应用程序时,该线程没有时间正确关闭 RCW,导致我的错误。这是否正确,我该如何解决这个问题?
我已经编辑了我的代码以反射(reflect)我得到的响应,但我仍然遇到同样的错误。代码更新了三点:
代码的相关部分现在在 StateReader 中:
// give the maximum load over all cores
public UInt64 CPULoad()
{
List<UInt64> list = new List<UInt64>();
using (ManagementObjectCollection results = searcher.Get())
{
foreach (ManagementObject result in results)
{
list.Add((UInt64)result.Properties["PercentProcessorTime"].Value);
result.Dispose();
}
}
return list.Max();
}
public void Dispose()
{
searcher.Dispose();
}
主要是:
gui.FormClosing += (a1, a2) => sub.Dispose();
Application.Run(gui);
reader.Dispose();
还有什么我可以做的来避免我得到的错误吗?
最佳答案
我认为您需要使 StateReader
成为一次性的,并在退出您的应用程序之前将其处置掉。 StateReader
应该处理 searcher
。但是,我认为真正的问题是您没有在 CPULoad
中处理 ManagementObject
。如果 GC 在 CPULoad
之后运行,RCW 将被释放。但是,如果您在 GC 之前退出,那么这可能会触发您看到的异常。
I think that using the classes in the management namespace creates a background thread that references a COM object wrapped in a Runtime Callable Wrapper
Observable.Interval
创建一个后台线程,CPULoad
在该线程上执行。
关于c# - 如何避免 RCW 清理上的竞争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9599538/
我正在使用 COM 互操作在使用 VS2012/.NET 4.5/Win8.1 的非托管应用程序中创建托管插件。所有互操作的东西似乎都正常,但是当我关闭应用程序时,我收到一个 MDA 异常,告诉我在释
是否可以在未知接口(interface)上增加 RCW 引用计数? (即不是底层 COM 对象的引用计数) 我有一些旧的 COM 服务器代码 int Method1(object comobject)
我有一个 gui 应用程序,它定期显示 cpu 负载。负载由 StateReader 类读取: public class StateReader { ManagementObjectSearc
引用非托管 COM 对象时,运行时可调用包装器 (RCW) 的范围是什么?根据文档: The runtime creates exactly one RCW for each COM object,
我正在尝试解决“无法使用已与其底层 RCW 分离的 COM 对象”错误的问题,我认为导致此问题的原因是 COM 对象在未实例化它们的线程上使用。 我不允许做太多的重构,并且由于对象应该在多个线程上可用
判断 COM 对象的引用计数是否已达到 0 的一种方法是尝试访问它的一个成员并捕获产生的 InvalidComObjectException,这不是很优雅,而且似乎不太适合。另一种方法是调用 Mars
Interop 和 RCW(运行时可调用包装器)有什么区别? 这只是术语吗? 最佳答案 Interop 用于调用原始 DLL 导出。 RCW(运行时可调用包装器)用于将 COM 对象暴露给 .NET
我正在尝试使用 OpcRcw.da.dll。如果我在测试控制台项目中互操作这个 dll,一切正常,但是如果我构建 dll 项目来进行互操作体操并将我的库引用到我的控制台项目中,我会收到此错误: COM
我有一些从某些 c# dll 调用的 COM 组件。 我还有一个使用该 .dll 的 winforms 应用程序。 当我关闭应用程序时出现此异常: COM object that has been s
只有有时(我还没有注意到模式),当我右键单击一个项目(各种类型的项目)并选择“特性”: 我通常在重新启动 VS2010 后可以查看项目页面。我正在使用 RTM 版本。 什么会导致此错误? 最佳答案 L
我正在进行单元测试。 我的解决方案中有 2 个项目,1 个是库项目,1 个是测试项目。库项目有一些 com 组件。测试项目正在测试库项目中的功能。这些库函数正在使用这些 com 对象。 第一个单元测试
只是想知道是否有人有足够的时间使用 WinRT 来了解 WinRT 和 .NET 4.5 中是否有一些区域会抹去 .NET 程序员在 VSTO 和 COM Interop Office 编程中遇到的与
我在我的应用程序中使用 Microsoft.Office.Interop.PowerPoint 来控制演示幻灯片。我可以使用代码连接到 PowerPoint PowerPointApp = Marsh
我正在处理大量 COM 互操作的大型多线程 C# 应用程序中工作。其他开发人员和我有足够的机会不小心调用 Single-Threaded Apartment (STA)来自 MTA 线程的 COM 对
我有时会遇到以下异常:无法使用与其底层RCW分离的COM对象 示例代码: using (AdOrganizationalUnit organizationalUnit = new AdOrganiza
我有一个使用 Office 互操作程序集的应用程序。我知道由运行时管理的“运行时可调用包装器 (RCW)”。但我不太确定引用计数是如何增加的。 MSDN 说, RCW keeps just one r
我查看了提到这个特定异常的各种问题(我访问过的 this question lists many of them)。另外,我有同样的general question as this post ,但在不
我正在订阅一个 WMI 事件并在我的应用程序关闭时收到“已与其底层 RCW 分离的 COM 对象无法使用”错误。这个问题有人问过before ,但这与我的情况完全不同。 我从我的主线程调用这段代码:
我正在处理一个项目,我需要在 C#.net 项目中调用一个非托管 COM 对象。在这个link ,我发现为了在 .net 中调用 COM 对象,需要在该对象上有一个 RC 包装器。所以,我只是想知道这
我有一个从外部 DLL 创建静态 devDrv 的 MyObject。如果 devDrv 是由 MyObject 构造函数创建的。代码工作正常。如果 devDrv 是由 MyObject.Connec
我是一名优秀的程序员,十分优秀!