Sto provando ad avere un thread separato in un'applicazione C# WinForms avviare un worker in background che controlli una barra di avanzamento (riquadro di selezione). Il problema è che quando provo a impostare la barra su visibile non fa nulla, e ho provato molte forme di Invoke ma non sembrano aiutare.Manipolazione di elementi dell'interfaccia utente da un'altra discussione
Il seguente metodo progressBarCycle
viene chiamato da una filettatura separata.
BackgroundWorker backgroundWorker = new BackgroundWorker();
public void progressBarCycle(int duration)
{
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.WorkerSupportsCancellation = true;
backgroundWorker.RunWorkerAsync(duration);
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
worker.ReportProgress(0);
DateTime end = DateTime.Now.AddMilliseconds((int)e.Argument);
while (DateTime.Now <= end)
{
System.Threading.Thread.Sleep(1000);
}
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (!this.IsHandleCreated)
this.CreateHandle();
statusStrip1.Invoke((MethodInvoker)delegate
{
progressBar1.Visible = false;
});
// if (!this.IsHandleCreated)
// {
// this.CreateHandle();
// if (InvokeRequired) this.Invoke((MethodInvoker)(() => progressBar1.Visible = false));
// else progressBar1.Visible = false;
// }
// else
// if (InvokeRequired) this.Invoke((MethodInvoker)(() => progressBar1.Visible = false));
// else progressBar1.Visible = false;
}
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (!this.IsHandleCreated)
this.CreateHandle();
statusStrip1.Invoke((MethodInvoker)delegate
{
progressBar1.Visible = true;
});
// if (!this.IsHandleCreated)
// {
// this.CreateHandle();
// if (InvokeRequired) this.Invoke((MethodInvoker)(() => progressBar1.Visible = true));
// else progressBar1.Visible = true;
// }
// else
// if (InvokeRequired) this.Invoke((MethodInvoker)(() => progressBar1.Visible = true));
// else progressBar1.Visible = true;
}
Mi manca qualcosa di ovvio qui? Le sezioni dei commenti sono altre cose che ho provato.
Ho inserito il file ProgressChanged e RunWorkerCompleted puramente per vedere se avrebbe risolto il problema. Quando avevo tutto quel codice incluso in DoWork, invece, avrebbe fatto esattamente la stessa cosa.Lo stato di Visible non cambierebbe mai, con o senza invocazione. - Oh, e probabilmente vale la pena ricordare che questo è un Marquee, quindi non intendo usare rapporti sui progressi. – UncleDave
@UncleDave quindi sembra che la barra di avanzamento si trovi all'interno di un altro controllo (pannello forse) che non è visibile. –
La barra di avanzamento si trova nel modulo che esegue questo codice, che è anche il modulo di avvio dell'applicazione. – UncleDave