Ich habe einige Zweifel bezüglich der using-Anweisung:
Ich habe eine Klasse namens
MyJob, welches wegwerfbar ist. Dann habe ich auch eine Eigenschaft auf MyJob JobResults, die auch Einweg ist.
Mein Code:
%Vor%Meine erste Frage lautet: In diesem Fall werden nach dem Verwendungsblock sowohl MyJob als auch MyJob.Results entfernt oder nur MyJob und NOT MyJob.Results?
Ich führe auch Parallelverarbeitung w.r.t Aufgaben in C # durch:
%Vor%Meine zweite q, im obigen Code, was ist der richtige Weg, um sicherzustellen, Objekte korrekt zu entsorgen, wenn Ausnahmen in Aufgaben behandelt werden?
Tut mir leid, wenn meine Fragen zu naiv oder verwirrend sind, weil ich immer noch versuche, C # zu lernen und zu verstehen. Danke Leute!
sind sowohl MyJob als auch MyJob.Results oder nur MyJob und NOT MyJob.Results?
Das ist subjektiv für die Implementierung Ihrer Dispose
-Methode. Da wir es in Ihrer Frage nicht gesehen haben, gehe ich davon aus, dass Sie Ihre Result
-Eigenschaft derzeit nicht in MyJob.Dispose
veräußern, daher wird es Letzteres sein.
Da nur MyJob
in eine using
-Anweisung eingebettet ist und wiederum davon ausgegangen wird, dass sie nichts mit Ihrer Result
-Eigenschaft zu tun hat, wird sie im Gegensatz zu Results
entsorgt, die nicht in eine% co_de eingeschlossen ist % -Anweisung.
Sie könnten entscheiden, dass using
, da es Ihre MyJob
-Eigenschaft einkapselt, auch dafür verantwortlich ist. Wenn Sie dies wünschen, können Sie Result
in Results
ablegen.
Was ist der richtige Weg, um sicherzustellen, dass Objekte korrekt entsorgt werden? Umgang mit Ausnahmen in Aufgaben?
Wenn der Delegat, der an die MyJobs.Dispose
übergeben wird, in eine Task
Anweisung eingeschlossen wird, sind Sie sicher, da using
Ihren Code in einen using
Block umwandelt, falls eine Ausnahme in Ihrer% co_de auftritt % block, der try-finally
-Block wird weiterhin using
ausführen.
Nur MyJobs ist entsorgt. Bei anderen Eigenschaften müssen Sie das Eigentumsrecht des Objekts verstehen: Wer das Objekt besitzt, sollte (im Allgemeinen) dafür verantwortlich sein, es zu beseitigen. Eine Eigenschaft, die IDisposable implementiert, könnte von anderen Instanzen verwendet werden, sodass Sie sie nur dann entfernen können, wenn Sie die IDisposable erstellt haben und keine anderen Verweise darauf vorhanden sind oder die Klasse ordnungsgemäß fehlschlägt, wenn sie weiß, dass sie entsorgt wurde / p>
Hier gibt es viele gute Antworten, aber eine Sache bleibt. Wenn Sie sicher sein möchten, dass Ihr Objekt ordnungsgemäß entsorgt wird, da es nicht verwaltete Ressourcen verwendet, sollten Sie in Ihrem Objekt einen Destruktor implementieren, wie z. B.
%Vor%Es wird jedoch empfohlen, dass Sie keinen Finalizer (Destruktor) verwenden, es sei denn, Sie schließen einen Typ mit nicht verwalteten Ressourcen ab, der keinen eigenen Finalizer enthält.
Siehe Ссылка für Best Practices zum Implementieren von IDisposable.
1) Der beste Weg besteht darin, JobResults
innerhalb der MyJob-Methode Dispose () zu platzieren. Sonst ist es nicht auf eigene Faust angeordnet.
2) Ich würde den finally
-Teil implementieren, jedes Objekt durchgehen und entsorgen. In den meisten Fällen müssen Sie dies jedoch nicht tun. lies das
Tags und Links c#