1

BackGroundWorker を何時間も動作させようとしてきました。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);
        }
    }
}
4

3 に答える 3

1

前述の IsBusy の問題は別として、DoFolderMonitoring などとは対照的に StartFolderMonitor が start で始まるという事実は、おそらくノンブロッキングであるため、DoWork ハンドラーはすぐに終了します。

于 2013-06-02T20:25:04.397 に答える
1

BackgroundWorker.IsBusyバックグラウンド スレッドが開始された後は true になるため、内部でテストしている場合は常に true になりますbgw_DoWork()。したがって、monitor.StartFolderMonitor(txtFolderPath.Text)呼び出されることはありません。

何をテストしようとしていますか?if (!worker.IsBusy)チェックを外すだけでいいと思います。

于 2013-06-02T20:15:15.323 に答える