C# BackgroundWorker RunWorkerAsync方法不会触发DoWork();
我已经试着让幕后工作人员工作好几个小时了。我似乎无法找到调用bgw.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
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方法上调试时,它只是不进入方法内部。感谢您抽出时间:)