3 回答
TA贡献1876条经验 获得超6个赞
使用反射(未测试):
public static void DisposeAllMembersWithReflection(object target)
{
if (target == null) return;
// get all fields, you can change it to GetProperties() or GetMembers()
var fields = target.GetType().GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
// get all fields that implement IDisposable
var disposables = fields.Where(x => x.FieldType.GetInterfaces().Contains(typeof(IDisposable)));
foreach (var disposableField in disposables)
{
var value = (IDisposable)disposableField.GetValue(target);
if (value != null)
value.Dispose();
}
}
TA贡献1812条经验 获得超5个赞
当然,只要确保您创建一个列表来保存它们,并尝试最终阻止以防止泄漏它们。
// List for holding your disposable types
var connectionList = new List<IDisposable>();
try
{
// Instantiate your page states, this may be need to be done at a high level
// These additions are over simplified, as there will be nested calls
// building this list, in other words these will more than likely take place in methods
connectionList.Add(x1);
connectionList.Add(x2);
connectionList.Add(x3);
}
finally
{
foreach(IDisposable disposable in connectionList)
{
try
{
disposable.Dispose();
}
catch(Exception Ex)
{
// Log any error? This must be caught in order to prevent
// leaking the disposable resources in the rest of the list
}
}
}
然而,这种方法并不总是理想的。嵌套调用的性质将变得复杂,并且要求调用在程序架构中处于最上层,您可能只想考虑在本地处理这些资源。
此外,这种方法在这些 Disposable 资源密集且需要立即释放的场景中严重失败。虽然您可以执行此操作,即跟踪您的 Disposable 元素,然后一次性完成所有操作,但对于像这样的托管资源,最好尝试使对象生命周期尽可能短。
无论您做什么,请确保不要泄漏 Disposable 资源。如果这些是连接线程,并且它们在一段时间内处于非活动状态,那么简单地查看它们的状态然后在不同的地方重新使用它们而不是让它们徘徊也可能是明智的。
TA贡献1848条经验 获得超6个赞
创建将处理所有一次性对象的方法:
public void DisposeAll()
{
x1.Dispose();
x2.Dispose();
x3.Dispose();
. . .
}
并在任何需要的地方调用它。
- 3 回答
- 0 关注
- 149 浏览
添加回答
举报