有人能解释我为什么要面对后台工作人员的问题吗?
backgroundWorker1_RunWorkerCompleted工作得很好,并将文本发送到textbox1,但是backgroundWorker1_DoWork不工作!它应该发送文本“工作.”到textbox1,但我在textBox1.Text = textBox1.Text + Environment.NewLine + DateTime.Now +@“>>”+str中会出现错误;
我得到的错误与交叉线程有关。
有人能帮忙吗?
芝士
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)
{
}
}
}编辑
我似乎能够用以下方法解决这个问题:
这个解决办法是正确的吗?或者这是一个肮脏的解决办法,我不应该这么做!?!
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;
}
}发布于 2010-12-27 09:18:08
这是故意的。DoWork()运行在另一个线程上,不应该使用任何GUI组件。在调试模式下,他立即被发现并被困住。
如果在调试器之外运行这个程序,它将(几乎总是)工作。但是很少事情会出错,很难捕捉到错误。
基本上,您的输出应该如下所示:
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。
发布于 2010-12-27 09:18:30
"DoWork“事件处理程序意味着您在后台线程上所做的工作。在这个线程上,您不应该直接访问UI。
"RunWorkerCompleted“事件处理程序在UI线程上执行。
通常,要从UI线程报告进度,需要为ProgressChanged注册一个事件处理程序,并从后台线程调用ReportProgress。或者,您可以使用Control.Invoke/Control.BeginInvoke,但是从一开始使用BackgroundWorker并不能带来多大的好处。
发布于 2010-12-27 09:18:16
你到底犯了什么错误?
这是可能的,这个textBox需要调用。
https://stackoverflow.com/questions/4537640
复制相似问题