मैं WinForms C# अनुप्रयोग में एक अलग थ्रेड रखने की कोशिश कर रहा हूं, एक पृष्ठभूमि कार्यकर्ता शुरू करता है जो प्रोग्रेसबार (मार्की) को नियंत्रित करता है। मुद्दा यह है कि जब मैं बार को दृश्यमान करने के लिए सेट करने की कोशिश करता हूं तो यह कुछ भी नहीं करता है, और मैंने कई प्रकार के आमंत्रण की कोशिश की है लेकिन वे मदद नहीं कर रहे हैं।यूआई तत्वों को किसी अन्य धागे के भीतर से जोड़ना
निम्न विधि progressBarCycle
को एक अलग थ्रेड से बुलाया जाता है।
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;
}
क्या मुझे यहां कुछ स्पष्ट याद आ रही है? टिप्पणी अनुभाग अन्य चीजें हैं जिनकी मैंने कोशिश की है।
मैंने प्रोग्रेस चेंज और रनवर्कर में रखा है यह देखने के लिए पूरी तरह से पूर्ण किया गया है कि यह मेरी समस्या को ठीक करेगा या नहीं। जब मेरे पास उस कोड को DoWork में शामिल किया गया था, तो यह वही काम करेगा।दृश्यमान राज्य कभी भी बिना किसी आमंत्रण के या बिना बदल देगा। - ओह और शायद यह उल्लेखनीय है कि यह एक मार्की है इसलिए मैं प्रगति रिपोर्ट का उपयोग करने का इरादा नहीं रखता हूं। – UncleDave
@UncleDave तो ऐसा लगता है कि प्रगति-बार एक और नियंत्रण (पैनल शायद) के अंदर है जो दिखाई नहीं दे रहा है। –
प्रगति पट्टी इस कोड को चलाने वाले फॉर्म पर है, जो कि एप्लिकेशन का प्रारंभिक रूप भी है। – UncleDave