Was versteht man unter "verwalteten" und "nicht verwalteten" Ressourcen in .NET?

Antworten:

80

Der Begriff "nicht verwaltete Ressource" wird normalerweise verwendet, um etwas zu beschreiben, das nicht direkt unter der Kontrolle des Garbage Collectors steht . Wenn Sie beispielsweise eine Verbindung zu einem Datenbankserver herstellen, werden Ressourcen auf dem Server (zum Aufrechterhalten der Verbindung) und möglicherweise andere Nicht-Netz-Ressourcen auf dem Clientcomputer verwendet, wenn der Anbieter nicht vollständig in verwaltetem Code geschrieben ist.

Aus diesem Grund wird für eine Datenbankverbindung empfohlen, den Code folgendermaßen zu schreiben:

using (var connection = new SqlConnection("connection_string_here"))
{
    // Code to use connection here
}

Da dies sicherstellt, dass .Dispose()das Verbindungsobjekt aufgerufen wird, wird sichergestellt, dass nicht verwaltete Ressourcen bereinigt werden.

rauben
quelle
19
Ich würde es ein wenig klarstellen: Eine "nicht verwaltete Ressource" ist etwas, nach dem der Müllsammler nicht mehr aufräumen kann, wenn er aufgegeben wird. Das Abonnement eines kurzlebigen Objekts für ein Ereignis von einem langlebigen Objekt wäre beispielsweise eine nicht verwaltete Ressource, obwohl beide Objekte unter der Kontrolle des Garbage Collector stehen, da der GC nicht wissen kann, dass das Abonnement vorliegt sollte verschrottet werden, wenn der Abonnent verlassen wird, der Herausgeber jedoch nicht. Wenn während des Lebens des Herausgebers eine unbegrenzte Anzahl von Abonnenten erstellt und aufgegeben werden könnte, würde dies zu einem Speicherverlust führen.
Supercat
12
Ein bisschen mehr Klarheit: SqlConnection (oder FileStream usw.) sind verwaltete Ressourcen, die intern nicht verwaltete Ressourcen verwenden, die GC nicht kennt.
Jimvfr
2
jimvfr ist richtig, SqlConnection ist ein Beispiel für verwaltete Ressourcen. Ein Beispiel für nicht verwaltete Ressourcen ist das Zuweisen von Speicher aus dem nicht verwalteten Speicher mithilfe der Methode Marshal.AllocHGlobal (). In diesem Fall handelt es sich um eine nicht verwaltete Ressource. Die beste Vorgehensweise besteht darin, einen Destruktor (~ ctor) zu verwenden und Marshal.FreeHGlobal () aufzurufen um diesen Speicher freizugeben.
Ygor Thomaz
Können Sie bitte ein Beispiel für verwaltete und nicht verwaltete Ressourcen geben?
Radha Manohar
32

Verwaltete Ressourcen sind reine .NET-Codes, die von der Laufzeit verwaltet werden und direkt von ihr gesteuert werden.

Nicht verwaltete Ressourcen sind solche, die es nicht sind. Dateihandles, angehefteter Speicher, COM-Objekte, Datenbankverbindungen usw.

Oded
quelle
13

In den Fragen und Antworten Was sind nicht verwaltete Ressourcen? 1 , Bruce Wood hat Folgendes gepostet:

Ich denke an die Begriffe "verwaltet" und "nicht verwaltet" auf diese Weise:

"Verwaltet" bezieht sich auf alles in der .NET-Sandbox. Dies umfasst alle .NET Framework-Klassen.

"Nicht verwaltet" bezieht sich auf die Wildnis außerhalb der .NET-Sandbox. Dies schließt alles ein, was Ihnen durch Aufrufe der Win32-API-Funktionen zurückgegeben wird.

Wenn Sie niemals eine Win32-API-Funktion aufrufen und niemals Win32-Handle-Objekte zurückerhalten, verfügen Sie nicht über nicht verwaltete Ressourcen. Dateien und Streams, die Sie über .NET Framework-Klassenmethoden öffnen, sind verwaltete Wrapper.

Kommentar: Möglicherweise halten Sie eine nicht verwaltete Ressource nicht direkt . Möglicherweise halten Sie jedoch eine nicht verwaltete Ressource indirekt über eine verwaltete "Wrapper-Klasse" wie System.IO.FileStream . Eine solche Wrapper-Klasse implementiert normalerweise IDisposable (entweder direkt oder über Vererbung).

... viele verwaltete (.NET Framework) Objekte enthalten nicht verwaltete Ressourcen, und Sie möchten diese wahrscheinlich so schnell wie möglich entsorgen () oder Ihren Anrufern zumindest die Möglichkeit dazu bieten. Hier kommt das Schreiben Ihrer eigenen Dispose () -Methode ins Spiel. Im Wesentlichen erledigt die Implementierung von IDisposable () zwei Dinge für Sie:

  1. Ermöglicht das Entfernen von Ressourcen, die Sie direkt vom Betriebssystem hinter dem Rücken von .NET abgerufen haben (nicht verwaltete Ressourcen).

  2. Ermöglicht es Ihnen und Ihren Anrufern, umfangreiche .NET-Objekte / .NET-Objekte freizugeben, die wertvolle Ressourcen in ihren schmutzigen kleinen Händen halten, die Sie / Ihre Anrufer jetzt freigeben möchten .

Kommentar: Durch die Implementierung IDisposableund damit Bereitstellung einer Dispose()Methode ermöglichen Sie einem Benutzer Ihrer Klasse, nicht verwaltete Ressourcen, die von einer Instanz Ihrer Klasse gehalten werden, deterministisch freizugeben .


1 Link, der ursprünglich in Sachin Shanbhags Antwort geteilt wurde . Zitiertes Material vom 17.11.2005. Beachten Sie, dass ich den zitierten Inhalt leicht kopiert habe.

DavidRR
quelle
5

Der grundlegende Unterschied zwischen einer verwalteten und einer nicht verwalteten Ressource besteht darin, dass der Garbage Collector alle verwalteten Ressourcen kennt. Zu einem bestimmten Zeitpunkt wird der GC den gesamten Speicher und die Ressourcen bereinigen, die einem verwalteten Objekt zugeordnet sind. Der GC kennt nicht verwaltete Ressourcen wie Dateien, Streams und Handles nicht. Wenn Sie sie also nicht explizit in Ihrem Code bereinigen, treten Speicherlecks und gesperrte Ressourcen auf.

Weitere Informationen finden Sie unter http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources

Sachin Shanbhag
quelle
1
"Die Idee hinter der IDisposable-Oberfläche ist, dass Sie Ressourcen deterministisch bereinigen und nicht verwaltete Ressourcen bereinigen können."
Zionpi
0

Verwaltete Ressourcen sind Ressourcen, die vom Garbage Collector freigegeben werden können, und nicht verwaltete Ressourcen können vom Garbage Collector nicht freigegeben werden. Zu diesem Zweck ist ein Destruktor erforderlich.

anil
quelle