首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.ComponentModel.BackgroundWorker

System.ComponentModel.BackgroundWorker
EN

Stack Overflow用户
提问于 2010-12-27 09:14:14
回答 3查看 1K关注 0票数 0

有人能解释我为什么要面对后台工作人员的问题吗?

backgroundWorker1_RunWorkerCompleted工作得很好,并将文本发送到textbox1,但是backgroundWorker1_DoWork不工作!它应该发送文本“工作.”到textbox1,但我在textBox1.Text = textBox1.Text + Environment.NewLine + DateTime.Now +@“>>”+str中会出现错误;

我得到的错误与交叉线程有关。

有人能帮忙吗?

芝士

代码语言:javascript
复制
using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace FolderWatchingGUI01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        public void output(string str)
        {
            textBox1.Text = textBox1.Text + Environment.NewLine + DateTime.Now +@"  >>  " +str;
        }


        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            output("Working ...");
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            output("Work Completed");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            button2.Enabled = true;
            button1.Enabled = false;
            output("Starting Work");
            backgroundWorker1.RunWorkerAsync();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            backgroundWorker1.CancelAsync();
            output("Work Canceld");
            button2.Enabled = false;
            button1.Enabled = true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

    }
}

编辑

我似乎能够用以下方法解决这个问题:

这个解决办法是正确的吗?或者这是一个肮脏的解决办法,我不应该这么做!?!

代码语言:javascript
复制
delegate void outputCallback(string text);


        public void output(string str)
        {
            if (textBox1.InvokeRequired)
            {
                outputCallback d = output;
                Invoke(d, new object[] { str });
            }
            else
            {
                textBox1.Text = textBox1.Text + Environment.NewLine + DateTime.Now +@"  >>  " +str;
            }
        }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-27 09:18:08

这是故意的。DoWork()运行在另一个线程上,不应该使用任何GUI组件。在调试模式下,他立即被发现并被困住。

如果在调试器之外运行这个程序,它将(几乎总是)工作。但是很少事情会出错,很难捕捉到错误。

基本上,您的输出应该如下所示:

代码语言:javascript
复制
    public void output(string str)
    {
        if (this.InvokeRequired)
        {
            var act = new Action<string>(output);
            this.Invoke(act, str);
        }
        else
        {
            textBox1.Text = textBox1.Text + Environment.NewLine + DateTime.Now + @"  >>  " + str;
        }
    }

此外,您应该检查完成的均衡器中的e.Error

票数 2
EN

Stack Overflow用户

发布于 2010-12-27 09:18:30

"DoWork“事件处理程序意味着您在后台线程上所做的工作。在这个线程上,您不应该直接访问UI。

"RunWorkerCompleted“事件处理程序在UI线程上执行。

通常,要从UI线程报告进度,需要为ProgressChanged注册一个事件处理程序,并从后台线程调用ReportProgress。或者,您可以使用Control.Invoke/Control.BeginInvoke,但是从一开始使用BackgroundWorker并不能带来多大的好处。

票数 1
EN

Stack Overflow用户

发布于 2010-12-27 09:18:16

你到底犯了什么错误?

这是可能的,这个textBox需要调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4537640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档