【问题标题】:The BackgroundWorker RunWorkerAsync method does not trigger DoWork();BackgroundWorker RunWorkerAsync 方法不会触发 DoWork();
【发布时间】:2013-06-02 20:11:03
【问题描述】:

我一直试图让 BackGroundWorker 工作几个小时。我似乎无法找出为什么我的 DoWork() 事件处理程序在调用 bgw.RunWorkerAsync() 后没有被提升;

我已经减少了不相关的代码,所以它更容易阅读。

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);
        }
    }
}

【问题讨论】:

  • 你有一个 bgw_ProgressChanged 处理程序,但你没有设置 this.bgw.WorkerReportsProgress = true。
  • 是的,确实如此。并将添加这个。但我还没有检查这些东西,因为我想让 DoWork() 方法首先工作。如果我不能让它工作,其余的都无关紧要;)但无论如何谢谢

标签: c# backgroundworker


【解决方案1】:

BackgroundWorker.IsBusy 将在其后台线程启动后为真,因此在bgw_DoWork() 中对其进行测试时,它将始终为真。因此,monitor.StartFolderMonitor(txtFolderPath.Text) 永远不会被调用。

您要测试什么?我认为您可以删除 if (!worker.IsBusy) 支票。

【讨论】:

  • ye if 语句确实没有意义;) 但它甚至没有进入 bgw_DoWork() 方法,因此删除 if 语句对我没有任何好处。编辑:我最终尝试做的是:启动一个监视器,扫描文件夹中的传入项目并将这些项目移动到不同的文件夹。我让这一切都没有问题,但是有了任务......现在我想添加一些东西:每当监视器类中的该方法移动文件时,将文件名添加到列表中并将其显示在列表框中。跨度>
【解决方案2】:

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

【讨论】:

  • 哦,哇,抱歉,这有点愚蠢。但我认为它没有进入 DoWork 方法,但它确实存在。在通过 runworkerasync 方法进行调试时,它只是不进入方法内部。谢谢你的时间:)
【解决方案3】:

打电话就行了

System.Windows.Forms.Application.DoEvents();

在 bgw.RunWorkAsync() 之前;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多