[英]The BackgroundWorker RunWorkerAsync method does not trigger DoWork();
I've been trying to get the BackGroundWorker to work for hours now. 我一直在努力让BackGroundWorker可以工作几个小时。 I can't seem to find out why my DoWork() eventhandler isn't getting raised after calling bgw.RunWorkerAsync(); 我似乎无法找出为什么在调用bgw.RunWorkerAsync()之后没有引发我的DoWork()事件处理程序;
I've cut down the irrelivant code, so it's a bit easyer to read. 我减少了无关紧要的代码,因此它更容易阅读。
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
will be true after its background thread been started, so it will always be true where you are testing it inside bgw_DoWork()
. BackgroundWorker.IsBusy
在其后台线程启动后将为true,因此在bgw_DoWork()
对其进行测试的地方始终为true。 Therefore, monitor.StartFolderMonitor(txtFolderPath.Text)
will never be called. 因此,永远不会调用monitor.StartFolderMonitor(txtFolderPath.Text)
。
What are you trying to test for? 您要测试什么? I think you can just remove the if (!worker.IsBusy)
check. 我认为您可以删除if (!worker.IsBusy)
检查。
除了前面提到的IsBusy问题之外,StartFolderMonitor以start开头而不是DoFolderMonitoring或类似的事实,这可能是非阻塞的,因此DoWork处理程序立即退出。
Just call 刚打电话
System.Windows.Forms.Application.DoEvents(); System.Windows.Forms.Application.DoEvents();
before bgw.RunWorkAsync(); 在bgw.RunWorkAsync()之前;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.