voglio che il mio programma da attendere dopo che sotto la lineaCome attendere filo per completare senza bloccare UI
frmProgressBarObj = PullMSI.ExtractByMSIName("products.txt", false);
come sopra metodo sta chiamando internamente filo attraverso StartProcessWithProgress() metodo. Voglio che il thread sia completato prima che // codice logic -2 line venga eseguito. Allo stesso tempo, non dovrebbe interrompere l'aggiornamento dell'interfaccia utente fatto da frmProgressBar.UpdateProgress(). Come faccio a fare questo?
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? Questa è un'applicazione per console. –
Il mio male. Scusa, per semplificare il codice, ho appena messo tutte le classi nell'applicazione console in modo da poter pubblicare facilmente qui. Ma la sua applicazione di Windows forma e processo iniziano sul tasto clic. – Akie
È possibile utilizzare uno di questi: 1) TPL con la continuazione dell'attività 2) Ripristina eventi (ManualResetEventSlim/AutoResetEventSlim) 3) Utilizzando altri meccanismi come Semaphore (scoraggiarti molto di farlo) 4) async/attendi se stai eseguendo. Net 4.5+. 5) Produttore/consumatore (overkill per il tuo caso d'uso). Fondamentalmente ci sono una varietà di modi in cui questo è possibile. Fai una lettura e scegli quella che ti piace di più. – kha