using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using KPlan.Util; namespace KPlan.Forms { class KBackgroundWorker { public BackgroundWorker backgroundWorker { get; set; } private Window parent; private KBgWorker2 pbDialog; public KBackgroundWorker(Window parent) { this.parent = parent; //可以返回工作进度 backgroundWorker = new BackgroundWorker(); backgroundWorker.WorkerReportsProgress = true; //允许取消 backgroundWorker.WorkerSupportsCancellation = true; backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted; //更新进度条 backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged; //backgroundWorker.DoWork += Query_Async; //backgroundWorker.DoWork += backgroundWorker_DoWork; //开始执行DoWork //backgroundWorker.RunWorkerAsync(); } public void Start(object param,bool disableCancel) { if (backgroundWorker.IsBusy) { return; } if (parent != null) { parent.IsEnabled = false; } pbDialog = new KBgWorker2(parent, backgroundWorker); if (disableCancel) { pbDialog.tb_cancel.Width = 0; pbDialog.tb_cancel.Visibility = Visibility.Hidden; } backgroundWorker.RunWorkerAsync(param); } public void Start(object param) { if (backgroundWorker.IsBusy) { return; } if (parent != null) { parent.IsEnabled = false; } pbDialog = new KBgWorker2(parent, backgroundWorker); backgroundWorker.RunWorkerAsync(param); } public bool IsCancel() { return backgroundWorker.CancellationPending; } private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { pbDialog.Dispatcher.Invoke(new Action(delegate { pbDialog.Close(); })); if (parent != null) { parent.IsEnabled = true; } if (e.Error != null) { KUtil.LogErr(e.Error); MessageBox.Show(parent, "发生异常:" + e.Error.Message); } else { if (e.Cancelled) { MessageBox.Show(parent, "已取消"); } //else { // MessageBox.Show(parent, "操作完成"); //} } } private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { pbDialog.progressBar.Value = e.ProgressPercentage; } public void Progress(string text, int progress) { pbDialog.Dispatcher.Invoke(new Action(delegate { pbDialog.lable.Content = text; })); backgroundWorker.ReportProgress(progress); } } }