gpt4 book ai didi

c# - 是否可以在没有任何人的情况下执行异步操作 "knowing"?

转载 作者:行者123 更新时间:2023-12-02 07:33:10 26 4
gpt4 key购买 nike

我正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com