在循环中处置所有成员

时间:2018-05-10 07:36:22

标签: c# reflection dispose

我有一个包含多个页面的非常大的项目,其中每个页面都有许多IDisposable个成员。

我正试图找出一种方法来处理循环中的所有IDisposable成员,这样我就不必在每个类上键入x1.Dispose(); x2.Dispose; ... xn.Dispose

有办法做到这一点吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

当然,只需确保创建一个列表来保存它们,并尝试最后阻止以防止泄漏它们。

// 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元素,然后一次性完成所有操作,但最好尝试将对象生存时间设置为 short ,以用于此类托管资源。

无论您做什么,请确保不要泄漏Disposable资源。如果这些是连接线程,并且它们在一段时间内处于非活动状态,那么简单地查看它们的状态然后在不同的地方重新使用它们而不是让它们闲逛也是明智的。