Disposen einer Task(Of T) mit IDisposable T

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Disposen einer Task(Of T) mit IDisposable T

    Hallo,

    ich habe ein IDisposable Objekt, dass ich in einem Sonderfall neuzuweisen muss.
    Da es ja IDisposable implementiert rufe ich vorher Dispose auf.
    Dadurch wirft das neuzuweisen jedoch einen Fehler, der entsprechend sagt das das Objekt Disposed wurde.

    Wenn ich es einfach so neuzuweise dann müsste die alte Ressource doch nicht sachgemäß entsorgt worden sein, oder?

    VB.NET-Quellcode

    1. Dim test = New Diposable
    2. ...
    3. If con = x Then test.Dispose : test = New Disposable
    4. ...
    5. test.Dispose


    Muss ich dafür eine weitere Variable einführen?

    VB.NET-Quellcode

    1. Dim test = New Diposable
    2. Dim backup as Disposable
    3. ...
    4. If con = x Then
    5. test.Dispose
    6. backup = New Disposable
    7. Routinefürbackup()
    8. backup.Dispose
    9. Else
    10. Routinefürtest()
    11. test.Dispose
    12. End If


    Viele Grüße

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Ich glaub ich raff das Problem nicht, da das hier klappt:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim NewForm As New Form1
    3. NewForm.Dispose()
    4. NewForm = New Form1
    5. NewForm.Dispose()
    6. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Du hast völlig recht. Es hat mich auch echt gewundert, ich habe mich da ein wenig vertan und es zu stark vereinfacht.

    Mein IDisposable ist eine Task(Of T). Und die Task hat eine Property Result. Wenn T auch ein IDisposable ist dann scheint das Disposen der Task nicht den Member Result automatisch disposen zu können, wie man es gewohnt wäre von anderen IDisposables, weil der Typ von Result T ist, und quasi gar nicht klar ist, ob das Disposable sein wird oder nicht.

    Ist das richtig das Task.Result extra Disposed werden muss wenn man eine Task disposed?

    VB.NET-Quellcode

    1. Dim responseTask = client.PostAsync(requestUrl, content)
    2. Try
    3. Dim response = responseTask.Result
    4. If response.StatusCode = Net.HttpStatusCode.Unauthorized Then
    5. Anmelden()
    6. client.DefaultRequestHeaders.Authorization = New Headers.AuthenticationHeaderValue(Anmeldung.type, Anmeldung.token)
    7. responseTask.Dispose()
    8. response.Dispose
    9. responseTask = client.PostAsync(requestUrl, content)
    10. response = responseTask.Result
    11. End If
    12. If response.IsSuccessStatusCode Then
    13. ...
    14. End If
    15. Finally
    16. If responseTask IsNot Nothing Then response.Dispose : responseTask.Dispose()
    17. End Try

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Weil ich dann die ganze Methode Async machen muss. Ich teste das ganze in ner Konsolenanwendung und da ist das irgendwie nervig wenn die Methode nebenläufig ist, weil dann die Reihenfolge der Konsolenlines durcheinander geht.

    Bevor die Property Result abgerufen wird ist die Taks in einem wartendem Status. Nach Abruf heißts RanToCompletion für die Task.
    Der Property-Abruf blockiert. Das ist aber weil die Task dann erst anfängt zu laufen. Mit Task.Wait wird die Result Property auch gefüllt.

    Jetzt wo ich drüber nachdenke, das Await zu nutzen, würde mir diesen Punkt bezüglich Disposen schön verheimlichen. Das hätt ich schon gern verstanden.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()