C# BackgroundWorker RunWorkerAsync方法不会触发DoWork();

C# BackgroundWorker RunWorkerAsync方法不会触发DoWork();,c#,backgroundworker,C#,Backgroundworker,我已经试着让幕后工作人员工作好几个小时了。我似乎无法找到调用bgw.RunWorkerAsync()后我的DoWork()事件处理程序没有被提升的原因 我已经删去了不相关的代码,所以它更容易阅读 namespace FolderMonitor { using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using Syst

我已经试着让幕后工作人员工作好几个小时了。我似乎无法找到调用bgw.RunWorkerAsync()后我的DoWork()事件处理程序没有被提升的原因

我已经删去了不相关的代码,所以它更容易阅读

namespace FolderMonitor
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;

    using FolderMonitor.Properties;

    public partial class MainForm : Form
    {
        private ExistingFileHandler exist = new ExistingFileHandler();
        private MonitoredFileHandler handler = new MonitoredFileHandler();
        private Monitor monitor;
        private BackgroundWorker bgw = new BackgroundWorker();

        public MainForm(Monitor monitor)
        {
            this.monitor = monitor;
            InitializeComponent();
            InitializeBackgroundWorker();
            txtFolderPath.Text = Settings.Default.monitoredFolder;
            txtNewFolderPath.Text = Settings.Default.destinationFolder;
            btnStop.Enabled = false;
        }

        private void InitializeBackgroundWorker()
        {
            bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
            bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
            bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
        }

        private void BtnStart_Click(object sender, EventArgs e)
        {
            btnStop.Enabled = true;
            btnStart.Enabled = false;
            exist.HandleExistingFiles(txtFolderPath.Text);
            listBoxFiles.Items.Clear();
            MonitoredFileHandler.MonitoredFolderPath = txtFolderPath.Text;
            MonitoredFileHandler.DestinationFolderPath = txtNewFolderPath.Text;
            this.bgw.RunWorkerAsync();
        }

        private void BtnStop_Click(object sender, EventArgs e)
        {
            this.bgw.CancelAsync();
            btnStart.Enabled = true;
            btnStop.Enabled = false;
        }

        private void bgw_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            if (!worker.IsBusy)
            {
                monitor.StartFolderMonitor(txtFolderPath.Text);
            }
        }

        private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            btnStart.Enabled = true;
            btnStop.Enabled = false;
        }

        private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            handler.MonitoredFiles.Add(txtNewFolderPath.Text);
        }
    }
}

BackgroundWorker.IsBusy
在其后台线程启动后将为真,因此在
bgw\u DoWork()
中测试时始终为真。因此,永远不会调用monitor.StartFolderMonitor(txtFolderPath.Text)


你想测试什么?我认为您可以删除
if(!worker.IsBusy)
检查。

除了前面提到的IsBusy问题之外,事实上StartFolderMonitor以start开头,而不是DoFolderMonitoring或类似的东西,它可能是非阻塞的,因此DoWork处理程序会立即退出

就打电话

System.Windows.Forms.Application.DoEvents()

在bgw.RunWorkAsync()之前


您有一个bgw_ProgressChanged处理程序,但尚未设置此值。bgw.WorkerReportsProgress=true。是的,这确实是真的。我会加上这个。但是我还没有检查这些东西,因为我想先让DoWork()方法工作。如果我不让它发挥作用,其余的都无关紧要;)但无论如何还是要谢谢你。如果这个说法真的没有意义;)但是,它甚至不在bgw_DoWork()方法中,因此删除if语句对我没有任何好处。编辑:我最终要做的是:启动一个监视器,扫描文件夹中的传入项目,并将这些项目移动到另一个文件夹。我的这些工作都没有问题,但是有任务。。现在我想添加这样的内容:每当monitor类中的方法移动文件时,将文件名添加到列表中并显示在列表框中。噢,哇,对不起,这有点愚蠢。但我认为它没有包含在DoWork方法中,但它确实包含在内。在runworkerasync方法上调试时,它只是不进入方法内部。感谢您抽出时间:)