Async Task wiederverwenden

  • VB.NET
  • .NET (FX) 4.0

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Async Task wiederverwenden

    Hi Leute

    Ich habe folgenden Code:

    VB.NET-Quellcode

    1. Public Function executeReaderAsync(ByVal pStatement As String, _
    2. Optional pTable As DataTable = Nothing, _
    3. Optional pValues As DBParameter = Nothing, -
    4. Optional pExpected As Integer = -1) As Task(Of DataTable)
    5. Return Task(Of DataTable).Factory.StartNew(Function() getDB.executeReader(pStatement, pTable, pValues, pExpected))
    6. End Function


    Ist es möglich diesen Task nur bei erster Verwendung zu instanziieren und bei weiteren Aufrufen dieser Methode wiederzuverwenden? Ich erhoffe mir dadurch immer den gleichen Thread zu erwischen <- geht das oder wird es zwangsläufig ein neuer Thread?

    DannyWave schrieb:

    Ich erhoffe mir dadurch immer den gleichen Thread zu erwischen
    Wozu?
    Bei einer neuen Instanz hast Du die Sicherheit, dass der Start-Zustand reproduzierbar ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    getDB gibt mir eine neue Datenbankverbindung zurück, wenn von einem neuen Thread aufgerufen. Ansonsten eine bestehende Verbindung. Das Async macht aus zeitlicher Sicht keinen Sinn, wenn ich grundsätzlich erst eine neue Verbindung aufbauen muss. Ich warte also mit der Asynchronen Methode immer länger, als wenn ich es Synchron machen würde. Das wollte ich nun gerne verhindern.

    Ich schätze aber, dass beim Starten eines Tasks immer ein neuer Thread gestartet wird. Richtig? Dann müsste ich anders an die Sache rangehen...

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

    DannyWave schrieb:

    Das wollte ich nun gerne verhindern.
    Das hätte ich auch nicht im Eröffnungspost geschrieben. :/
    ----
    Überleg Dir mal folgenden Thead-Ablauf:

    VB.NET-Quellcode

    1. Public DataAvailable As Boolean = False
    2. Public ThreadBeenden As Boolean = False
    3. Private Sub ThreadMain(o As System.Object)
    4. ' Verbindung instanziieren
    5. Do
    6. If DataAvailable Then ' Daten werden von außrn bereitgestellt und per Flag signalisiert
    7. ' abarbeiten
    8. DataAvailable = False
    9. Else
    10. System.Threading.Thread.Sleep(100) ' sinnvolle Zeit
    11. End If
    12. If ThreadBeenden Then ' Signal von außen, dass der Thread beendet werden soll
    13. Exit Do
    14. End If
    15. Loop
    16. ' hier ist der Thread beendet
    17. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hmmm... du meinst der Task sollte dem Thread Arbeit auf den Tisch knallen und dieser erst um 17.00 Uhr Feuerabend machen? Das würde mir in einer art StackQueue zusätzlich das Problem des noch zu verhindernden parallelen Aufrufs abnehmen. Dann muss ich mir nur noch überlegen, wie mein Task auf die Daten wartet und der Thread sie diesem zugänglich macht.
    Dennoch: Alles in Allem nicht der schönste und wartbarste Code oder?

    DannyWave schrieb:

    der Task sollte dem Thread Arbeit auf den Tisch knallen
    Ganz genau.
    Dies ist übrigens die übliche und freundliche Art, einen Thread zu beenden: Der Thread hört auf zu arbeiten, wenn seine Arbeit getan ist. Und zwar freiwillig.
    Einen Thread mit dem Holzhammer Thread.Abort() zu beenden ist unfein.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!