nit*_*ain 2 c# winforms progress-bar
我是winforms的新手,在我的代码中,我正在使用for循环更新进度条,现在我需要以循环计数的形式更新Label,如下所示-
公共部分类Form1:表单{public Form1(){InitializeComponent();
Run Code Online (Sandbox Code Playgroud)Shown += new EventHandler(Form1_Shown); // To report progress from the background worker we need to set this property backgroundWorker1.WorkerReportsProgress = true; // This event will be raised on the worker thread when the worker starts backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork); // This event will be raised when we call ReportProgress backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); } private void Form1_Load(object sender, EventArgs e) { } void Form1_Shown(object sender, EventArgs e) { // Start the background worker backgroundWorker1.RunWorkerAsync(); } // On worker thread so do our thing! void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { // Your background task goes here for (int i = 0; i <= 100; i++) { label1.Text = "Trade" + i; // Report progress to 'UI' thread backgroundWorker1.ReportProgress(i); // Simulate long task System.Threading.Thread.Sleep(100); } } // Back on the 'UI' thread so we can update the progress bar void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { // The progress percentage is a property of e progressBar1.Value = e.ProgressPercentage; } }
但是在访问label1时,它抛出错误-
跨线程操作无效:从创建该线程的线程以外的线程访问控件“ label1”。
如何更新label1的文本
您只能从创建该控件的线程(即 UI 线程)访问该控件。在其他线程(例如您的BackgroundWorker)中,您需要使用Control.BeginInvoke。
label1.BeginInvoke(delegate { label1.Text = "Trade" + i; });
Run Code Online (Sandbox Code Playgroud)
在进度处理程序中而不是在工作线程中更新标签。
// On worker thread so do our thing!
void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// Your background task goes here
for (int i = 0; i <= 100; i++)
{
// Report progress to 'UI' thread
backgroundWorker1.ReportProgress(i);
// Simulate long task
System.Threading.Thread.Sleep(100);
}
}
// Back on the 'UI' thread so we can update the progress bar - and our label :)
void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// The progress percentage is a property of e
progressBar1.Value = e.ProgressPercentage;
label1.Text = String.Format("Trade{0}",e.ProgressPercentage);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23684 次 |
| 最近记录: |