- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 COM 库 RCWs 。我一直发现最好的做法是在所有非托管资源超出范围之前手动释放它们并进行垃圾收集。我不希望这“减慢”我的应用程序的速度,并且我不在乎这实际上何时完成(如果有的话)在应用程序退出之前。所以我有这个方法:
// best effort:
internal static void CleanupComObjects(params object[] toRelease)
{
Task.Run(() =>
{
var t = Task.WhenAll(toRelease.Select((x) =>
Task.Run(() =>
System.Runtime.InteropServices.Marshal.ReleaseComObject(x))));
t.Wait();
System.GC.Collect();
});
}
在我的 API/应用程序的任何客户端或用户不知道或关心异步代码正在运行的情况下执行此操作是否可以,只要它不会产生除调用者预期之外的任何副作用,或者有什么我没有考虑过的事情可能会导致意想不到的问题吗? (<-- 对于“主要基于意见”的密切选民,请注意最后一行。)
最佳答案
I don't care when this actually finishes, if at all, before the application exits
该说法似乎与您的另一说法相冲突:
I've always found it's a best practice to manually release any unmanaged resources and garbage collect before they go out of scope
如果您真的不在乎,在我看来您可以让 .NET 管理 COM 对象的生命周期,正如 RCW 旨在完成的那样。
也就是说,我不认为你的方法本身有什么问题。在我看来,这种实现方式似乎很严厉,但这种“一劳永逸”的方法也发生在许多其他场景中。您甚至可以认为 .NET 的基本垃圾收集算法就是一个示例(毕竟,您通常不知道或无法控制它何时或如何发生……它“就是这样”)。
就我个人而言,我会以更精简的方式编写它:
internal static async Task CleanupComObjects(params object[] toRelease)
{
await Task.WhenAll(toRelease.Select((x) =>
Task.Run(() =>
System.Runtime.InteropServices.Marshal.ReleaseComObject(x))));
System.GC.Collect();
}
或者甚至:
internal static Task CleanupComObjects(params object[] toRelease)
{
return Task.Run(() =>
{
foreach (object o in toRelease)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
}
System.GC.Collect();
});
}
(从方法返回 Task
使调用者有机会观察操作的完成情况。这不是必需的,但您可能会发现有一个很好的理由,例如,以便您可以检测可能发生的异常。)
换句话说,我不清楚为什么您希望对 ReleaseComObject()
的调用同时发生。根据这些对象的来源和公寓型号,您可能会遇到麻烦。
说到这里,您的问题中缺少的另一个细节是您在这里处理的公寓型号。如果这些是 STA 对象,您的操作将由 .NET 编码回所属线程,这意味着任何尝试与该线程上运行的任何其他代码同时释放它们(无论是与对象或其他调用无关的其他代码) ReleaseComObject()
) 将毫无意义。您可能会启动释放并发,但释放操作和该线程中的其他代码无论如何都会被序列化。
说了这么多……
一般来说,我更喜欢编写解决问题的代码。这里是否存在您正在尝试解决的特定问题?该代码已经有点不规则,因为您不依赖 .NET 的正常 GC 管理来处理对象。然后,您可以通过将对它们的显式管理转移到其他线程来增加这种不规则性,这可能会成功,也可能不会成功,具体取决于您正在处理的 COM 对象的类型。
我希望您做所有这些工作都是有充分理由的。但这是什么原因呢?您想要解决什么具体问题?您是否能够确认此类代码确实解决了该问题?
在我看来,这些都是重要的问题,但上面的帖子中没有足够的信息来解决这些问题。所以我鼓励你自己调查一下。您可能需要考虑一个单独的 Stack Overflow 问题,在其中提供一个很好的 Minimal, Complete, and Verifiable code example可靠地重现您试图解决的问题,以寻求解决该问题的替代方法的建议。
关于c# - 是否可以在没有任何人的情况下执行异步操作 "knowing"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39273821/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!