ich schwach Ereignisse bin mit, wenn ich nicht deterministisch abmelden (sonst würde ich +=
und -=
statt schwacher Veranstaltung bevorzugen):Schwache Ereignisse und GC
class SomeType
{
public SomeType(...)
{
// object doesn't know when it will be removed
WeakEventManager(SomeSource, EventArgs).AddHandler(someSourceInstance,
nameof(SomeSource.SomeEvent), (s, e) => { ... });
}
}
Auf diese Weise, wenn das Objekt Müll gesammelt wird, dann Ereignis Handler wird nicht aufgerufen. Perfekt.
Jedoch. Wenn das Objekt noch nicht Garbage Collection ist (aber keine starken Referenzen mehr vorhanden sind), wird der Event-Handler trotzdem aufgerufen.
Meine Frage ist eher allgemein: Was soll ich tun, wenn schwache Ereignisse verwendet werden? Sollte ich erwarten, ungültiger Aufruf im Event-Handler bei der Verwendung von schwachen Ereignissen? Oder sollte ich force GC diesen Fall vermeiden (Art von deterministischem "Aufräumen")? Etwas anderes?
Sie haben es rückwärts - schwache Ereignisse erlauben Abonnenten, Garbage Collected zu sammeln, wenn sie nur durch Event-Handler am Leben erhalten werden. Sie sind nicht da, um die Event-Handler loszuwerden, nur weil der Abonnent für GC berechtigt ist, das ist ein Nebeneffekt. Sie können das als "ungültigen Anruf" bezeichnen, aber das ist es nicht. Die kurze Antwort ist also "Ja, Sie sollten solche Anrufe erwarten"; desto länger ist "was machst du überhaupt, dass dies ein Problem ist, und fehlt dir Code, der deine Absichten explizit machen kann"? –
@ JeroenMostert, ich hatte Speicherverlust wegen fehlenden '- ='. Es war nicht * einfach * (ich habe nicht * unmöglich * gesagt), sich abzumelden, deshalb habe ich versucht, schwache Ereignisse zu verwenden. Sie lösen Memory Leakage Problem perfekt, aber ein anderes Problem entsteht ... daher meine Frage. Wie soll ich Absicht machen? "Dieses Objekt benötigt diese Methode um klar zu sein? 'IDisposable'? – Sinatr
'IDisposable' ist eine Möglichkeit, ja. Es ist der Hauptmechanismus, den C# für die deterministische Säuberung hat. Obwohl es technisch nur für die Freigabe nicht verwalteter Ressourcen vorgesehen ist, wird es häufig in Frameworks für die deterministische Bereinigung verwendet, selbst wenn keine nicht verwalteten Ressourcen beteiligt sind. Es hat den Vorteil der Sprachunterstützung ('using') und signalisiert dem Entwickler eindeutig, dass dieses Objekt explizit freigegeben werden soll. Noch besser als "IDisposable" ist es jedoch, die Eigentumsregeln für Ihre Objekte zu ermitteln und die Eigentümer dazu zu bringen, das Objekt, wenn überhaupt möglich, "herunterzufahren". –