2009-06-23 7 views
1

J'ai une classe bMainframe qui gère les connexions à 4 mainframes différents. Il permet d'ouvrir la même bibliothèque sous-jacente sous-jacente de manière spécifique et de connecter plus d'un ordinateur central à la fois. Chaque bibliothèque possède son propre code de mise au rebut pour la ressource de connexion mainframe non managée. L'encapsuleur possède également un code qui appelle le code de mise au rebut de la connexion mainframe individuelle.Puis-je disposer de ces ressources non gérées sans nécessiter de référence à chacune?

Cela provoque une erreur si le projet de quelqu'un n'utilise pas les 4 unités centrales, mais appelle la mise au rebut sur le wrapper. (FileLoadException n'a pas pu charger l'assembly X des 4 mainframes gérés) Depuis ce code de disposition vérifie lequel des 4 n'est pas nothing/null. Même si rien/null cela provoque .net pour essayer de charger l'assembly et se bloquer.

Le code d'élimination dans l'emballage extérieur est-il utile ou nécessaire? est-il un moyen de vérifier si l'assembly pour un type est même chargé qui ne déclenche pas.net pour charger le type/assembly?

J'ai modifié le code ci-dessous pour bloquer l'exception fileload, mais je ne crois pas que ce soit la meilleure solution.

Protected Overridable Sub Dispose(ByVal disposing As Boolean) 
    If Not Me.disposedValue Then 
     If disposing Then 
      ' TODO: free managed resources when explicitly called 
     End If 
     Try 
      If Me._Linx IsNot Nothing Then 
       If _Linx.cnLinx IsNot Nothing Then 
        Try 
         _Linx.Disconnect() 

        Catch ex As Exception 
         Trace.WriteLine("Error doing linx.disconnectSession") 
        End Try 
        Try 
         _Linx.Dispose() 
        Catch ex As Exception 
         Trace.WriteLine("Error doing linx.dispose") 
        End Try 
       End If 
      End If 
     Catch ex As IO.FileLoadException 
      Debug.WriteLine("Failed to load LinxFile") 
     End Try 
     Try 
      If Me._Acaps IsNot Nothing Then 
       _Acaps.Disconnect() 
       _Acaps.Dispose() 
      End If 
     Catch ex As IO.FileLoadException 
      Debug.WriteLine("Failed to load AcapsFile") 
     End Try 
     Try 
      If Me._Dart IsNot Nothing Then 
       Try 
        _Dart.Dispose() 
       Catch ex As Exception 
        Trace.WriteLine("Error disposing of Dart") 
       End Try 
      End If 
     Catch ex As IO.FileLoadException 
      Debug.WriteLine("Failed to load DartFile") 
     End Try 
     Try 
      If LpsOpen Then 
       Try 
        _Lps.Dispose() 
       Catch ex As Exception 
        Trace.WriteLine("Error disposing of Lps") 
       End Try 
      End If 
     Catch ex As IO.FileLoadException 
      Debug.WriteLine("Failed to load LpsFile") 
     End Try 

     ' TODO: free shared unmanaged resources 
    End If 
    Me.disposedValue = True 
End Sub 

Répondre

0

Peut-être que cela pourrait être manipulé avec quatre classes séparées héritant d'une classe de base qui aurait mise en œuvre légèrement différente dans leurs fonctions de disposition ... alors vous pouvez itérer dans un tableau et les disposer tous si vous en utilisez plus d'un dans certains cas. Quelque chose ne semble pas correct à propos de savoir quelles ressources sont incluses au moment de l'exécution dans cette utilisation particulière, puisque vous connaissez les différents mainframes au moment de la conception.

De même, une fois que vous avez libéré des objets à ramasser par le récupérateur de mémoire, il peut être judicieux d'exécuter GC.Collect() afin que le garbage collector s'exécute immédiatement.