Ich möchte mein Programm nachWie für Thread warten, ohne zu beenden UI blockiert
frmProgressBarObj = PullMSI.ExtractByMSIName("products.txt", false);
unter der Schlange warten, wie oben Verfahren intern Faden durch StartProcessWithProgress() -Methode aufrufen. Ich möchte, dass dieser Thread abgeschlossen wird, bevor // Code-Logik -2 Zeile ausgeführt wird. Zur gleichen Zeit sollte die UI-Aktualisierung von frmProgressBar.UpdateProgress() nicht gestoppt werden. Wie mache ich das?
namespace NS1
{
public partial class frmMain : Form
{
private void button1_Click(object sender, EventArgs e)
{
frmProgressBar frmProgressBarObj = PullMSI.ExtractByMSIName("products.txt", false);
//code logic - 2
MessageBox.Show("This is executing immediately.
I want to wait until above thread is complete");
}
}
public partial class frmProgressBar : Form
{
public void UpdateProgress(String strTextToDisplayOnProgress)
{
progressBar1.BeginInvoke(
new Action(() =>
{
progressBar1.Value++;
lblFileName.Text = strTextToDisplayOnProgress;
if (progressBar1.Value == progressBar1.Maximum)
{
this.Hide();
}
}));
}
public delegate void DelProgress();
public void StartProcessWithProgress(DelProgress delMethodCode, int maxCount)
{
InitializeProgress(maxCount);
Thread backgroundThread = new Thread(new ThreadStart(delMethodCode));
backgroundThread.Start();
}
}
public static class PullMSI
{
public static frmProgressBar ExtractByMSIName(String strProductFilePath, bool reNameMSI)
{
frmProgressBar frmProgressBar = new frmProgressBar();
frmProgressBar.StartProcessWithProgress(() =>
{
//StreamRader sr declaration and other code
while (!sr.EndOfStream)
{
//logic here
frmProgressBar.UpdateProgress("Copying sr.msiname");
}
}, 2);
return frmProgressBar;
}
}
}
UI? Dies ist eine Konsolenanwendung. –
Mein schlechtes. Sorry, Um den Code zu vereinfachen, habe ich einfach alle Klassen in die Konsolenanwendung gelegt, damit ich sie hier einfach posten kann. Aber seine Windows-Formular-Anwendung und Prozess starten auf Knopfdruck. – Akie
Sie können eine der folgenden Möglichkeiten nutzen: 1) TPL mit Taskfortsetzung 2) Ereignisse zurücksetzen (ManualResetEventSlim/AutoResetEventSlim) 3) Andere Mechanismen wie Semaphore verwenden (davon abraten, dies zu tun) 4) async/await, wenn Sie gerade laufen. Netto 4.5+. 5) Produzent/Verbraucher (Overkill für Ihren Anwendungsfall). Grundsätzlich gibt es eine Vielzahl von Möglichkeiten, dies zu erreichen. Lesen Sie diese und lesen Sie eine, die Ihnen am besten gefällt. – kha