Ich habe eine Anwendung, die ich ausgewählt habe, um Thread. Die Absicht dahinter ist, mehrere Threads gleichzeitig auszuführen, um die Anwendung zu beschleunigen.C# Thread Async-Verarbeitung
Derzeit ich die Anwendungseinstellungen Schleife, Erstellen eines Threads für jede Einstellung, dann starten Sie jede, und beitreten, damit ich sagen kann, wenn sie alle abgeschlossen sind.
Leider wird dabei jeder Thread synchron ausgeführt, was den Zweck vereitelt.
Ich könnte es ändern, um den Join zu entfernen, aber dann kann ich nicht feststellen, wann alle Threads fertig sind (ich muss dies tun, als wenn sie alle fertig sind, habe ich einen einzigen Prozess zu laufen).
Ich fange an zu denken, Threading ist nicht für mich, aber das sollte ich mehr auf die threading.tasks oder die parallel.foreach, aber ich bin unsicher, die Komplexität von diesen beiden. Ich habe weder Mechanismus vor (und auch nur dabbled mit Gewinde)
unten ist ein Codeausschnitt verwendet, die zur Zeit meine Themen
foreach (SettingsProperty value in Properties.Settings.Default.Properties)
{
//parse out the line in the settings
if (value.Name.ToString() != <<criteria>>)
{
//this is one that we want to do something with
sett = value.DefaultValue.ToString().Split(stringSeparators, StringSplitOptions.None);
//set the directory
Directory.CreateDirectory(<<directory>>);
//fire the thread to retrieve the image form the url
ThreadWithState tws = new ThreadWithState(<<parameters>>);
Thread t = new Thread(new ThreadStart(tws.ThreadProc));
t.Start();
t.Join();
}
}
UploadFiles();
Derzeit wird diese führt die Fäden nacheinander und führt dann den letzten Prozess laicht . Wenn ich den Aufruf von t.join entferne, werden die Threads asynchron ausgeführt, aber auch der Upload wird ausgeführt, bevor alle Threads abgeschlossen sind.
Wie kann ich entweder den Code ändern zu warten, bis alle Threads zu beenden, oder implementieren die Parallel.ForEach (was ich denke, kann arbeiten, aber haben kein Verständnis) oder einige threading.tasks implementieren funktionieren so I können Sie die Task.WhenAll Methode (was ich denke, auch arbeiten können, aber haben kein Verständnis)
Warum rufen Sie 't.Join()'? –
Ihre Frage ist zu breit. Es gibt viele gültige Möglichkeiten, um Dinge gleichzeitig auszuführen. Ihr Code versucht keine dieser Möglichkeiten. Durch sofortiges Aufrufen von 'Join()' in dem Thread, den Sie gerade gestartet haben, starten Sie keinen anderen Thread, bis der aktuelle fertig ist. Wenn du nicht warten willst, bevor du einen anderen Thread startest, ** dann warte nicht **. –
Sie sagen, Sie wissen, was das richtige Werkzeug ist - erstellen Sie einen asynchronen Workflow - und dass Sie nicht wissen, wie es geht. Also * lerne wie es geht *. Dies ist keine Tutorial-Site. Es gibt viele Tutorials zu parallelen und asynchronen Workflows. Geh und hol dir eins! Für IO-gebundene Aufgaben wie diese würde ich zunächst etwas über asynchrone Workflows lernen. Sie müssen nicht mehrere Threads einbeziehen. –