Guten Tag zusammen,
ich würde mich als Einsteiger definieren und bastel mir gern mal das ein oder andere Tool, dass mir das Arbeiten am PC erleichtert.
Ich bin nun auf die Thread Funktion gestoßen. Ich arbeite momentan an einem Windows Forms Projekt und klicke auf einen Button. Der Button führt eine Methode in einem neuen Thread aus. Ich möchte nun dass einen MessageBox aufpopt sobald der Thread sein Code abgearbeitet hat. Mach ich dies nun mit Thread.Join und dann die MsgBox dann bleibt wiederum auch das Hauptfenster mit seinem Thread hängen.
Gibt es sowas in der Art wie
Thread.Start();
Thread.Join()
{
string alternative = "und nur die sozusagen eingeklammerte Zeile dem Thread.Join angehängt wird?"
}
und der fortlaufende Code sofort weitergeführt wird?
Es gibt bei mir eine Abfrage und es wird eine der 3 Methodenaufrufe abgearbeitet. Ich möchte, dass egal welche der 3 Methodenaufrufe genommen wird, nach dem Thread eine MsgBox aufpoppt.
Auszug aus Projekt:
private void button_copy_Click(object sender, EventArgs e)
{
if (Directory.Exists(textBox_directorySource.Text) && Directory.Exists(textBox_directoryTarget.Text))
{
if (checkBox_clear.Checked) clearFolder(textBox_directoryTarget.Text);
if (checkBox_createFolder.Checked)
{
int x = 1;
DirectoryInfo cf = new DirectoryInfo(textBox_directorySource.Text);
ogt = textBox_directoryTarget.Text + @"\" + cf.Name;
try
{
Directory.CreateDirectory(ogt);
if (Directory.Exists(ogt))
{
Thread dc1 = new Thread(delegate () { DirectoryCopy(textBox_directorySource.Text, ogt, true); });
dc1.Start();
dc1.Join();
Msgb_Backup(); //Aufruf Methode mit MsgBox, bleibt dies so, dann hab ich den Effekt das die MsgBox wie gewollt danach aufpoppt aber
x = 0; //das Button Klick Event stoppt bzw. auch erst fertig ist wenn der Thread fertig ist.
}
}
catch
{
do
{
gt = textBox_directoryTarget.Text + @"\" + cf.Name + "_" + Convert.ToString(x);
try
{
Directory.CreateDirectory(gt);
if (Directory.Exists(gt))
{
Thread dc2 = new Thread(delegate () { DirectoryCopy(textBox_directorySource.Text, gt, true); });
dc2.Start();
dc2.Join();
Msgb_Backup(); //Aufruf Methode mit MsgBox, bleibt dies so, dann hab ich den Effekt das die MsgBox wie gewollt danach aufpoppt aber
x = 0; //das Button Klick Event stoppt bzw. auch erst fertig ist wenn der Thread fertig ist.
}
}
catch
{
x = x + 1;
}
}
while (x != 0);
}
}
else
{
Thread dc3 = new Thread(delegate () { DirectoryCopy(textBox_directorySource.Text, textBox_directoryTarget.Text, true); });
dc3.Start(); //Aufruf Methode mit MsgBox, bleibt dies so, dann hab ich den Effekt das die MsgBox wie gewollt danach aufpoppt aber
dc3.Join(); //das Button Klick Event stoppt bzw. auch erst fertig ist wenn der Thread fertig ist.
Msgb_Backup();
}
}
}
Bei weiteren Infos einfach sagen.
veni vidi vici
Hallo,
die korrekte herangehensweise wäre aus dem Thread heraus ein Event auszulösen, auf das du reagierst.
Um deinen Code jetzt aber nicht all zu weit außeinander zu reißen wäre mein Vorschlag, dass du aus der Methode "DirectoryCopy" deine Methode "Msgb_Backup()" aufrufst.
In dieser musst du allerdings auf den Threadwechsel mittels Invoke achten.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Hallo,
... oder button_copy_Click
als async
deklarieren, und jeweils den Teil
Thread dc1 = new Thread(delegate () { DirectoryCopy(textBox_directorySource.Text, ogt, true); });
dc1.Start();
dc1.Join();
ersetzen durch
await Task.Run(() => DirectoryCopy(textBox_directorySource.Text, ogt, true));
@metroid, schau Dir lieber gleich async/await
und Tasks an, für sowas würde man heute besser keine Threads mehr nehmen.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
@inflames2k, @MarsStein
Vielen Dank für eure Antworten.
Werde gleich nach Feierabend mal euren Tipps nachgehen und dann schreiben wie ich es umgesetzt habe. 🙂
veni vidi vici