![](/img/trans.png)
[英]RunWorkerAsync() method of BackgroundWorker doesn't trigger Do_Work event
[英]The BackgroundWorker RunWorkerAsync method does not trigger DoWork();
我一直在努力讓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);
}
}
}
BackgroundWorker.IsBusy
在其后台線程啟動后將為true,因此在bgw_DoWork()
對其進行測試的地方始終為true。 因此,永遠不會調用monitor.StartFolderMonitor(txtFolderPath.Text)
。
您要測試什么? 我認為您可以刪除if (!worker.IsBusy)
檢查。
除了前面提到的IsBusy問題之外,StartFolderMonitor以start開頭而不是DoFolderMonitoring或類似的事實,這可能是非阻塞的,因此DoWork處理程序立即退出。
剛打電話
System.Windows.Forms.Application.DoEvents();
在bgw.RunWorkAsync()之前;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.