C# 由于回调而阻止GC处理对象
我有一个C++/CLI应用程序,在其中为我们的客户机公开订阅API。 在这个API中,他们给了我一个C#回调(Action),我一直从应用程序中调用它来发布一些数据 问题是:客户机说当他们的对象超出范围时,不会对他们的对象调用GC,因为他们给我的回调是他们的成员变量,我的应用程序对它有一个强引用,这是真的,我将这个回调存储在我的应用程序中 我知道在这种情况下,这将是非常常见的问题。但我不确定如何解决这个问题。C# 由于回调而阻止GC处理对象,c#,callback,garbage-collection,c++-cli,C#,Callback,Garbage Collection,C++ Cli,我有一个C++/CLI应用程序,在其中为我们的客户机公开订阅API。 在这个API中,他们给了我一个C#回调(Action),我一直从应用程序中调用它来发布一些数据 问题是:客户机说当他们的对象超出范围时,不会对他们的对象调用GC,因为他们给我的回调是他们的成员变量,我的应用程序对它有一个强引用,这是真的,我将这个回调存储在我的应用程序中 我知道在这种情况下,这将是非常常见的问题。但我不确定如何解决这个问题。 所以我需要建议: 我的应用程序应该如何处理此回调,以便它不会阻止GC处理客户端对象 如
所以我需要建议:
我的应用程序应该如何处理此回调,以便它不会阻止GC处理客户端对象 如果需要更多详细信息,请留下评论。您有两种选择:
- 使用,而不是你的强引用
- 让您的用户有机会注销他们向您注册的
操作
两者都应该起作用。有人不恰当地使用了全局变量。可能是您,也可能是在静态变量中存储对象引用的客户端应用程序。如果是你,那么你必须做点什么,WeakReference可以完成这项工作。但是,在某些情况下,客户端应用程序希望您保持其对象的活动性,这是一个相当大的新风险,他们通常会这样做。通过允许客户端应用程序显式取消注册回调来解决这个棘手的问题,现在回调完全在他们的控制之下。