C# 背景工作者问题

C# 背景工作者问题,c#,winforms,backgroundworker,C#,Winforms,Backgroundworker,编辑:我通过在代码中创建后台工作程序而不是在设计中拖放来解决问题 现在我知道如何使用后台工作人员了 问题 这是我第一次使用BGWorker,所以我的问题是 光标不会变为“等待” 进度条不会更新 未调用RunWorkerCompleted 但是文本框会更新 我做错什么了吗 代码 using System; using System.ComponentModel; using System.Windows.Forms; namespace BGWorker { public parti

编辑:我通过在代码中创建后台工作程序而不是在设计中拖放来解决问题

现在我知道如何使用后台工作人员了

问题

这是我第一次使用BGWorker,所以我的问题是

  • 光标不会变为“等待”
  • 进度条不会更新
  • 未调用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个提示,解决了问题,谢谢:)