Ich habe eine Methode, die den Produktkatalog eines Webshops neu erstellt. Dies ist notwendig, nachdem ich einige Produktinformationen geändert habe. Nach der Wiederherstellungs-Methode möchte ich eine zweite Methode starten, um den Volltextindex des Webshops zu erstellen. Ich kann den Status der ersten Methode (RebuildCatalog) beobachten. Wenn der Status "RebuildFinished" lautet, möchte ich die zweite Methode (GenerateFullTextIndex) starten. Ich möchte Thread-Funktionalität verwenden. Kann jemand ein Beispiel für die Implementierung dieses Szenarios erstellen?Starten Sie die zweite Methode, nachdem die erste Methode mit Thread-Funktionalität beendet wurde C#
Starten Sie die zweite Methode, nachdem die erste Methode mit Thread-Funktionalität beendet wurde C#
Antwort
Ich möchte Thread-Funktionalität verwenden.
Es klingt wirklich nicht wie du es tust. Das Starten einer Methode nach der anderen ist so einfach wie:
var status = RebuildCatalog();
if (status == Status.RebuildFinished)
{
GenerateFullTextIndex();
}
Kein Threading erforderlich. Wenn Sie wirklich denken, Sie brauchen mehrere Threads, sollten Sie erklären warum Sie denken, sie werden Ihnen helfen. An welchem Punkt müssen Sie mehrere Aufgaben gleichzeitig ausführen?
Da ich von Ihrer Frage ausgehen kann, benötigt Ihre Wiederherstellungsmethode wahrscheinlich viel Zeit und deshalb möchten Sie in einem separaten Thread laufen. Daher würde ich vorschlagen, Event based async pattern zu implementieren. Wenn die Methode zum erneuten Erstellen (async) abgeschlossen ist, wird das fertige Ereignis mit AsyncCompletedEventArgs (das Sie zur Weitergabe des Ergebnisstatus ableiten können) ausgelöst und von dort aus starten Sie Ihre zweite Methode.
Nun, wenn Sie ein mehrere Threads verwenden möchten, und Ihre Anrufe in Kette organisierne so werden sie auf einem anderen Thread ausgeführt werden, sondern in der Reihenfolge, und Sie verwenden .NET Framework 4.0>
, können Sie eine Task Parallelism verwenden, wie zum Beispiel unter Verwendung von Task::ContinueWith Methode.
Beispiel (preudocode von MSDN):
Task<byte[]> getData = new Task<byte[]>(() => GetFileData());
Task<double[]> analyzeData = getData.ContinueWith(x => Analyze(x.Result));
Task<string> reportData = analyzeData.ContinueWith(y => Summarize(y.Result));
getData.Start();
//or...
Task<string> reportData2 = Task.Factory.StartNew(() => GetFileData())
.ContinueWith((x) => Analyze(x.Result))
.ContinueWith((y) => Summarize(y.Result));
Ereignisse verwenden würde zu sein scheinen einfacher als den Status beobachten.
In Ihrem Katalog Code Feuer einer "fertigen" Veranstaltung nach Abschluss neu zu erstellen:
public event EventHandler<EventArgs> RebuildFinished;
private void Rebuild(...)
{
// Rebuild the catalog
this.RebuildFinished(this, new EventArgs(...));
}
es dann handhaben:
this.catalog.RebuildFinished += this.RebuildFinished;
private void RebuildFinished(object sender, EventArgs e)
{
// Rebuild the index
}
nun diese beiden können (und wahrscheinlich sollte) auf die Verwendung von Threads sein sicherzustellen, dass die Benutzeroberfläche der Anwendung bleibt ansprechbar:
this.catalogThread = new Thread(new ThreadStart(this.catalog.Rebuild));
BackgroundWorker bw1 = new BackgroundWorker();//To rebuild catalog.
BackgroundWorker bw2 = new BackgroundWorker();//To generate text.
public Form1()
{
InitializeComponent();
bw1.DoWork += bw1_DoWork;
bw1.RunWorkerCompleted += bw1_RunWorkerCompleted;
bw2.DoWork += bw2_DoWork;
bw2.RunWorkerCompleted += bw2_RunWorkerCompleted;
bw1.RunWorkerAsync();//Start new thread. - Rebuild catalog.
}
void bw1_DoWork(object sender, DoWorkEventArgs e)
{
//Rebuild catalog.
}
void bw1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
bw2.RunWorkerAsync();//Generate text.
}
void bw2_DoWork(object sender, DoWorkEventArgs e)
{
//Generate text.
}
void bw2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Whatever...
}
- 1. C# -Aufnahmemethode, nachdem die Browsersteuerung beendet wurde?
- 2. C# -Methode, die ausgeführt wird, nachdem die Assembly geladen wurde
- 3. WPF: Zurückgeben einer Methode, nachdem eine Animation beendet wurde
- 4. Methode, die nach Aufruf aufgerufen wird, wurde beendet
- 5. Wie wird die zweite Funktion aufgerufen, nachdem die erste Funktion ausgeführt wurde?
- 6. PostgreSQL Verbindung beenden, nachdem die Methode beendet ist
- 7. new MailAddress() Beendet die Methode
- 8. Können wir die Methode aufrufen, nachdem die Anwendung minimiert wurde?
- 9. Wie wird die Verarbeitung fortgesetzt, nachdem die Animation beendet wurde?
- 10. Wie aktiviert man die Formularschaltfläche, nachdem der Prozess beendet wurde?
- 11. iphone: Starten Sie die Schleifenanimation neu, nachdem die Ansicht ausgeblendet wurde und dann wieder angezeigt wird.
- 12. So schließen Sie die Jetty-HTTP-Verbindung, nachdem die Web-Service-Methode ausgeführt wurde
- 13. Erhalten Threads automatisch Garbage Collected nachdem die Methode run() in Java beendet wurde?
- 14. Zurück zum Startbildschirm, nachdem die Aktivität beendet wurde.
- 15. Die Methode cellForRowAtIndexPath-Methode wurde nicht aufgerufen
- 16. Wie wird eine Java-Anwendung ordnungsgemäß beendet, die beendet wird, nachdem die Befehlszeile geschlossen wurde, von der sie ausgeführt wurde?
- 17. Aktion die Tastendruck-Methode, nachdem der Schlüssel eingegeben wurde
- 18. Abrufen der Instanz, die die Methode in aufgerufen wurde C#
- 19. Facebook-Zugriff behalten, nachdem die App beendet wurde iOS Swift
- 20. android - So zeigen Sie den Dialog an, nachdem die Aktivität beendet wurde
- 21. Senden von lokalen Benachrichtigungen, nachdem die App beendet wurde
- 22. Der Browser lädt weiter, nachdem die Ajax-Anfrage beendet wurde.
- 23. Wie wird die Wiedergabe von Audio fortgesetzt, nachdem der View-Controller auf iOS beendet wurde?
- 24. Ermitteln Sie die Klasse, in der die Methode definiert wurde?
- 25. Die Methode in_array wurde nur einmal ausgeführt?
- 26. Starten Sie eine App mit Push-Benachrichtigung, nachdem es beendet wurde
- 27. Absicht wurde nicht korrekt wiederhergestellt, nachdem die Aktivität beendet wurde, wenn die oberen und unteren Flags
- 28. Wie warte ich darauf, dass die erste Funktion beendet wird, bevor die zweite ausgeführt wird?
- 29. Fehler Aufruf Methode ‚‘: Die Methode wurde nicht gefunden [404]
- 30. Objective-C und Speicherlecks, nachdem ein Programm beendet wurde?
Weil, wenn ich die Umbaumethode ausführe, es sehr viel Zeit kostet (e.a. 1 Minute), wenn es fertig ist. Ich möchte nicht auf der Website warten. Ich möchte nur auf den Button Rebuild Katalog drücken. Und dann möchte ich, dass Methode 1 im Hintergrund startet und wenn Methode 1 beendet ist (ich kann den Status der Neuerstellung überprüfen) Ich möchte Methode 2 starten (Volltextindex generieren). Ich hoffe du verstehst meine Situation. – Ola
@ user1326231: Es klingt also wie Sie * beide * Anrufe auf dem gleichen neuen Thread sein wollen? –