2009-10-29 12 views
5

Eine asynchrone Frage:EndInvoke() - optional oder nicht?

Ich habe über das Internet gelesen viele Artikel für und gegen Delegate.EndInvoke() ist optional. Die meisten dieser Artikel sind 4-5 Jahre alt. Viele tote Links.

Kann jemand erklären, in .NET 2.0 - ist EndInvoke() in der Tat verhindert eine sonst unvermeidliche Speicherleck, und wenn ja können Sie bitte angeben, was dieses Leck verursacht?

Zum gleichen Thema: Wenn EndInvoke() tatsächlich ein Muss ist - finde ich den besten Weg zur Implementierung von Fire-and-Forget-Mechanismen mit einer Callback-Methode, die EndInvoke() ausführt. Ich würde gerne von jedem hören, der anders denkt.

Danke, O

Antwort

8

Für Delegate.EndInvoke Sie sollte es nennen. Für Control.EndInvoke hat das WinForms-Team gesagt, dass Sie nicht anrufen müssen. Ich weiß nicht, über das Äquivalent für WPF, aber ich denke, es ist eine gute Idee, dies zu tun, es sei denn, Sie haben einen guten Grund zu glauben, dass Sie nicht müssen.

Ich habe einige "Feuer und vergessen" Code für Delegierte in meiner threading article - etwa auf halbem Weg (Suche nach "Feuer").

+0

Was bedeutet fire-n-forget? Ich nahm an: 1) Wenn Sie eine BeginInvoke machen und weder Polling, Waithandles oder Callback verwenden, dann ist es eine Fire-N-Forget-Methode 2) Nur Void-Return-Methoden können für Fire-N-Forget verwendet werden, so dass Sie nicht brauchen Sorgen Sie sich, nachdem Sie einen BeginInvoke ausgeführt haben, mit drei der oben genannten Methoden. Ich denke, wenn Sie vorhaben, Rückruf zu verwenden, um Speicherlecks zu vermeiden, ist es nicht mehr Feuer-N-vergessen. –

+0

Das war genau meine Frage. Wenn die Richtlinie immer EndInvoke() verwenden soll, gibt es keine Option für Feuer-und-Vergessen. Ein bisschen seltsam. – tsemer

5

Vom msdn:

Immer EndInvoke rufen Sie Ihren asynchronen Aufruf zu vervollständigen.

Ich rate Ihnen, die Richtlinien zu befolgen, auch wenn es heute ohne Lecks funktioniert, kann es morgen ändern.

Verwandte Themen