2017-05-17 2 views
0

Momentan arbeite ich an einer Anwendung, die mit C# entwickelt wurde. Ich habe eine Frage zu Aufgaben. Ich habe meine Forschung zum Thema Aufgaben und asynchrone Programmierung gemacht. Aber ich bin immer noch nicht ganz sicher bei der Arbeit mit Aufgaben.Verwendung von Aufgaben zum Initiieren eines neuen Threads in C# -Programmierung

Diese Anwendung hat eine Methode nämlich ReadOrWriteDBTable. Diese Methode führt jede Sekunde entweder eine Lese- oder eine Einfügeoperation für eine SQL-Tabelle durch. Grundsätzlich wird diese Methode jede Sekunde aufgerufen. Zur Zeit läuft diese Methode im selben Thread wie der GUI-Thread der Anwendung. Am Anfang ist das kein Problem, weil sehr wenig Daten in der Tabelle vorhanden sind, aber wenn die Datenmenge in der Tabelle ansteigt, kann es viele Probleme auf der GUI bringen. Daher möchte ich diese Datenbankoperationen in einem anderen Thread als dem des GUI-Threads durchführen.

Das bedeutet, dass jede Sekunde die Methode ReadOrWriteDBTable über einen neuen Thread aufgerufen werden sollte. Dies bringt Multi Threading und ich glaube, es wird schwierig, den Threadpool zu verwalten. Was ich von TASKS verstanden habe, ist, dass all die komplexen Operationen von Multiple Threading komplett von einem TASK abgewickelt werden. Also habe ich das obige Problem der Mehrfach Threading mit Aufgaben in der folgenden Weise behandelt.

public int PollingTrigger 
{ 
    get 
    { 
     return this.pollingTrigger; 
    } 

    set 
    { 
     this.pollingTrigger = value; 

     Task.Factory.StartNew(ReadOrWriteDBTable); 
    } 

} 

Public void ReadOrWriteDBTable() 
{ 
    // Database select and update…. 
} 

Die PollingTrigger Eigenschaft wird jede Sekunde und wiederum eine neue Aufgabe aufgerufen wird, die für das Verfahren ReadOrWriteDBTable() erstellt. Da ich keine Ergebnisse von der Aufgabe zurückgeben muss, verwende ich nicht das async- und das await-Schlüsselwort für die Aufgabe und möchte keine asynchronen Operationen ausführen. Ich würde gerne wissen, ist diese Verwendung von Aufgaben korrekt und sicher vor Ausnahmen? Wird mir das helfen, einen neuen Thread zu initiieren, wenn ein neuer Wert auf die Eigenschaft PollingTrigger gesetzt wird (in dieser Anwendung jede Sekunde)?

Es tut mir leid für solch eine detaillierte Erklärung. Ich wollte nur meine Frage klarstellen. Ich hoffe es ist klar . Freue mich auf deine Tipps oder Antworten!

+2

Haben Sie diesen Artikel (http://blog.stephencleary.com/2012/02/async-and-await.html) schon gesehen? Könnte hilfreich sein –

+1

Verwenden Sie Task.Run(), die sichere Kurzschrift für Task.Factory.StartNew ist, und incase von mehreren Lesevorgängen, ich denke, Sie sollten sicherstellen, dass Sie eine Art von Flag in der DB zu wissen, seine ausgewählt, aber noch nicht aktualisiert anderer Thread kommt in – brykneval

Antwort

1

Sie müssen Task Route nicht gehen. Ich bin mir nicht sicher, ob nicht await -ing (oder .Wait) auf eine ausstehende Aufgabe Ressourcen leckt oder nicht (ich denke, dass sie gemeint sind, aber nicht sicher sind), aber Sie können einfach Timer Klasse verwenden, die eine verwenden wird von ThreadPool-Threads zum Ausführen einer beliebigen Funktion in einem festgelegten Intervall, was genau das ist, was Sie wollen. Einfacher zu verwalten. Es gibt mehrere Timer, die .NET bietet, siehe Beschreibung im Link zur Unterscheidung.

+0

erwartet nicht gewährt nicht-uithread von selbst. Es funktioniert häufig so, aber es ist nicht in jedem Fall so. –

+0

@ IvanIčin, ja, du hast Recht, ich habe nicht einmal darüber nachgedacht. Es hat nur gefühlt, dass Aufgaben hier keine passende Lösung sind, und jetzt hast du es genagelt, warum ich es intuitiv gefühlt habe. Vielen Dank! So +1 zu Ihrer Antwort auch :) – LB2

2

Um Ihre Frage streng zu beantworten, garantiert dies nicht, dass Sie einen neuen Thread haben werden. Die Aufgabe kann für jeden Thread im Thread-Pool ausgeführt werden, es ist jedoch nicht garantiert, dass es sich um einen neuen Thread handelt.

Allerdings wird dies sicherstellen, dass die Operation nicht auf UI-Thread ausgeführt wird, was soweit ich verstehe, was Sie eigentlich fragen wollten. Obwohl es vielleicht nicht elegant oder effizient ist (nicht sicher, warum Sie diese ganze Zahl brauchen), aber es wird funktionieren, könnte gut genug oder vielleicht sogar sehr gut sein, da ich keinen Einblick in den Rest des Projekts habe.

+0

Vielen Dank @Ivan Ičin für Ihre Antwort! Ja, mein Ziel war es nicht im selben Thread wie die UI laufen zu lassen. Es spielt keine Rolle, ob neue Threads benötigt werden oder nicht, weil ich mit einem Flag überprüft habe, ob die Datenbank ausgelastet ist oder nicht. – Tom92

0

Als @Ivan Ičin sagt mit Task ist keine Garantie, dass Sie einen neuen Thread bekommen.Sie können QueueUserWorkItem verwenden einen verfügbaren Thread von Thread-Pool zu bekommen, wenn es keine verfügbaren Threads ist es für einen warten:

QueueUserWorkItem(ReadOrWriteDBTable); 

Aber, wenn Sie zur Verbesserung der Leistung in Ihrem Programm suchen müssen Sie verwenden async und await anstelle von Task oder Thread, weil sie (Threads) die E/A-Operationen wie Sockets blockieren können und Sie die Ressourcen optimieren.

UPDATE (12. Juni): Acording mit MSDN:

Asynchronität ist für Aktivitäten unerlässlich, die möglicherweise blockieren, sind wie, wenn die Anwendung im Web zugreift. Der Zugriff auf eine Web-Ressource ist manchmal langsam oder verzögert. sprechen von async und await, dieses Dokument spricht über die Verwendung von Asynchron mit UI https://msdn.microsoft.com/es-mx/library/hh191443(v=vs.110).aspx

Und in Ihrem Fall und halten:

Diese Informationen könnten in diesem Link werden readed

Wenn Sie Wenn Sie asynchrone Methoden verwenden, reagiert die Anwendung weiterhin auf die Benutzeroberfläche. Sie können beispielsweise die Größe eines Fensters ändern oder es minimieren, oder Sie können die Anwendung schließen, wenn Sie nicht auf den Abschluss warten möchten.

So, wie Sie wollen, helfen mit Asynchron-Methoden, die Ihnen die behaivor implementiert, die Sie für yout UI suchen, aber wenn Sie den await Operator verwenden, mit einem async Verfahren, wird es den Faden machen warten, bis die async Methode wurde beendet.

+0

Danke @Jorge Omar Medra! Aber ich glaube, mit Warten und asyn, die Aufgabe wird warten auf die Aufgabe abgeschlossen sein und dann mit der Ausführung anderer Zeile von Codes (wie eine synchrone Operation) fortgesetzt. Aber ich möchte, dass sowohl der Aufgaben- als auch der GUI-Thread parallel ablaufen. – Tom92

+0

@ Tom92, ich habe eine Antwort auf meine Antwort gemacht. Ich denke immer, dass Async-Methoden Ihnen helfen werden. –

Verwandte Themen