使用FileSystemWatcher进行后台工作

时间:2016-03-10 04:55:17

标签: c# multithreading backgroundworker filesystemwatcher

我正在尝试实施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'从其创建的线程以外的线程访问。

1 个答案:

答案 0 :(得分:0)

您正在从前台线程的后台线程调用MessageBox。这就像在两个独立的线程中做UI,这是禁忌。

您可以做的是使用事件或后台线程中的event aggregator。我可能会选择后者。这样,当出现问题时,您的后台线程可以(并且应该)立即中止并通过消息通知它无法处理该文件。

将后台任务视为没有任何UI的东西。它位于后台,只能使用事件或消息与UI线程进行通信。