我正在尝试实施BackgroundWorker
来监控FileSystemWatcher
服务。
我的代码分为:
Classes.cs包含所有方法,变量和FileSystemWatcher
实现。主要的Form1,包含表单数据和调用按钮\等。当我运行我的程序时,所有发生的事情都是光标改变(这已经是预期的) - 动作发生在后台(事情已经完成)但我的进度条上没有显示任何报告。我从一个网站得到了这个例子,并将其改编为我的代码 - 我有什么不对的吗?我相信有一些事实涉及这个事实我唯一称之为filesystemwatcher - 但我希望它会根据“在背景上”运行的动作报告进度。
感谢任何帮助。感谢
我的form1代码(BackgroundWorker
部分)和FileSystemWatcher
如下:
namespace PPF_Converter_v10
{
public partial class Form1 : Form
{
private FileManipulation prg;
//private FileManipulation FileOp;
public Form1()
{
InitializeComponent();
//FileOp = new FileManipulation();
prg = new FileManipulation();
//Load config before the program begins - loading sample config or newly generated config
prg.LoadConfig();
FillTextBox();
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
}
BackgroundWorker代码:
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
if (!textBox1.Text.Contains("\\"))
{
MessageBox.Show("Please define the input folder before starting");
}
else if (!textBox2.Text.Contains("\\"))
{
MessageBox.Show("Please define the XML Output folder before starting");
}
else if (!textBox3.Text.Contains("\\"))
{
MessageBox.Show("Please define the Converted PPF Output Folder before starting");
}
else if (!textBox4.Text.Contains("\\"))
{
MessageBox.Show("Please define the Invalid PPF Output Folder before starting");
}
else
{
// calls the watcher
// prg.FileWatcher.SynchronizingObject = progressBar1.
prg.ProgramProcessing(textBox1.Text);
}
// do some long-winded process here
// this is executed in a separate thread
int maxOps = 1000000;
for (int i = 0; i < maxOps; i++)
{
//rtbText.AppendText(i.ToString() + "\r\n");
// report progress as a percentage complete
bgWorker.WorkerReportsProgress = true;
bgWorker.ReportProgress(100 * i / maxOps);
}
}
private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// update the progress bar
pbProgress.Value = e.ProgressPercentage;
}
private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// return to "normal" mode of operation
this.Cursor = Cursors.Default;
btnGo.Enabled = true;
}
private void btnGo_Click_1(object sender, EventArgs e)
{
// give the appearance of something happening
this.Cursor = Cursors.WaitCursor;
btnGo.Enabled = false;
// call RunWorkerAsync to start the background thread
bgWorker.RunWorkerAsync();
}
启用RichtextBox
时抛出异常:
附加信息:跨线程操作无效:控制'rtbText'从其创建的线程以外的线程访问。
答案 0 :(得分:0)
您正在从前台线程的后台线程调用MessageBox。这就像在两个独立的线程中做UI,这是禁忌。
您可以做的是使用事件或后台线程中的event aggregator。我可能会选择后者。这样,当出现问题时,您的后台线程可以(并且应该)立即中止并通过消息通知它无法处理该文件。
将后台任务视为没有任何UI的东西。它位于后台,只能使用事件或消息与UI线程进行通信。