C# 背景工作者问题
编辑:我通过在代码中创建后台工作程序而不是在设计中拖放来解决问题 现在我知道如何使用后台工作人员了 问题 这是我第一次使用BGWorker,所以我的问题是C# 背景工作者问题,c#,winforms,backgroundworker,C#,Winforms,Backgroundworker,编辑:我通过在代码中创建后台工作程序而不是在设计中拖放来解决问题 现在我知道如何使用后台工作人员了 问题 这是我第一次使用BGWorker,所以我的问题是 光标不会变为“等待” 进度条不会更新 未调用RunWorkerCompleted 但是文本框会更新 我做错什么了吗 代码 using System; using System.ComponentModel; using System.Windows.Forms; namespace BGWorker { public parti
- 光标不会变为“等待”
- 进度条不会更新
- 未调用RunWorkerCompleted
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace BGWorker
{
public partial class Main : Form
{
public Main()
{
InitializeComponent();
progressBar1.Minimum = 0;
progressBar1.Value = 0;
progressBar1.Maximum = 100;
}
private void button1_Click(object sender, EventArgs e)
{
Cursor.Current = Cursors.WaitCursor;
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= 100; i++)
{
textBox1.AppendText(i.ToString());
textBox1.AppendText("\n");
backgroundWorker1.ReportProgress(i);
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
label1.Text = e.Error.Message;
}
else
{
label1.Text = "All Done !";
Cursor.Current = Cursors.Default;
}
}
}
}
使用系统;
使用系统组件模型;
使用System.Windows.Forms;
命名空间BGWorker
{
公共部分类Main:表单
{
公用干管()
{
初始化组件();
progressBar1.最小值=0;
progressBar1.值=0;
progressBar1.最大值=100;
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
Cursor.Current=Cursors.WaitCursor;
backgroundWorker1.RunWorkerAsync();
}
私有void backgroundWorker1\u DoWork(对象发送方,DoWorkEventArgs e)
{
对于(inti=1;i我同意pst
始终在代码隐藏中创建工作人员-在表单上拖放从来都不是一个好主意
您从不从DoWork访问UI元素。只能从ReportProgress和RunWorker Completed事件访问UI元素
if语句段应包含最常见的路径和else中最不常见的路径
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= 100; i++)
{
sb.AppendLine(i.ToString());
backgroundWorker1.ReportProgress(i);
}
e.Result = sb.ToString();
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error == null)
{
textbox1.Text = e.Result.ToString();
label1.Text = "All Done !";
Cursor.Current = Cursors.Default;
}
else
{
label1.Text = e.Error.Message;
}
}
private void backgroundWorker1\u DoWork(对象发送方,DoWorkEventArgs e)
{
StringBuilder sb=新的StringBuilder();
对于(int i=1;i 1)不要从DoWork
事件访问UI元素。即使在这种特殊情况下,“规则”也是有充分理由的:-)2)连接事件的代码在哪里?对不起,我忘记了(1)…我没有访问原始项目中的任何UI。关于(2),我提供的代码不起作用吗,还需要什么?确保事件已连接。VS生成器将把所有代码放在分部类的InitializeComponent
方法中--可以手动检查(并将相关部分复制“n”粘贴“证明”:-),虽然它也应该在UI designer事件属性中可见。代码不起作用,但我使用了您提供的3个提示,解决了问题,谢谢:)