Pin einen Funktionszeiger

8

Ich muss einen verwalteten Rückruf an einen nicht verwalteten TCP-Empfänger übergeben. Da es ein Thread ist, der für die Lebensdauer der Anwendung vorhanden sein muss, muss ich verhindern, dass der Müll gesammelt wird. Ich habe überall gelesen, dass Pinning Funktion Pointer nicht erforderlich ist und GCHandle.Alloc wird die Aufgabe, Garbage Collection zu verhindern.

Aber ist das gegeben? Ich habe gesehen, dass der AppPool, der diesen Code hostet, mit einer Zugriffsverletzung abstürzt. Warum sollte ich nicht die Tatsache vermuten, dass dieser Fehler auftritt, weil der Funktionszeiger "Garbage Collection" war?

Dieser Beitrag unterstützt diese Tatsache.

Aktualisierung: Dies scheint die Abstürze erheblich reduziert zu haben. Gibt es ein Problem mit diesem Ansatz?

%Vor%     
Krishter 09.07.2012, 17:58
quelle

1 Antwort

8

Ich mache genau das, was Sie vorschlagen - GCHandle.Alloc auf dem Delegaten, aber ohne Pinning - und hatte keine Probleme in der umfangreichen Verwendung auf vielen verschiedenen Plattformen und auf .NET-Versionen 2.0 - 4. Etwas wie:

%Vor%

mit FunctionPointer wurde dann an den systemeigenen Code übergeben, und DelegateHandle wurde für die spätere Bereinigung beibehalten.

Dies scheint die beste Referenz zu sein: Ссылка .

Nichts in dem Post, auf das Sie verweisen, widerspricht dieser Referenz - Sie müssen den Delegaten vor der Garbage Collection schützen, es ist nur so, dass Pinning nicht erforderlich ist .

    
Govert 09.07.2012 19:28
quelle

Tags und Links