using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace Backgroundworkerdemo
{
public partial class Form1 : Form
{
/// <summary>
/// 本实例演示如何在关闭窗体的时候取消Backgroundworker中正在运行的任务
/// </summary>
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerSupportsCancellation = true;
backgroundWorker1.DoWork += backgroundWorker1_DoWork;
backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
} void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Console.WriteLine("Completed");
this.Close();//throw new NotImplementedException();
}
protected override void OnClosing(CancelEventArgs e)
{
backgroundWorker1.CancelAsync();
//如果还有任务在处理,取消关闭窗口,在任务处理完毕后再关闭
if (backgroundWorker1.IsBusy)
{
e.Cancel = true;
}
else
base.OnClosing(e);
}
private void Form1_Load(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
} void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//检查是否已经发起取消操作
while (!backgroundWorker1.CancellationPending)
{
Thread.Sleep(1000);
Console.WriteLine(DateTime.Now);
}
//throw new NotImplementedException();
} private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
}
}

  

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; using System.Xml;
using System.Threading; namespace BackgroundWorkerDownload
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent(); backgroundWorker1.DoWork += BackgroundWorker1_DoWork;
backgroundWorker1.RunWorkerCompleted += BackgroundWorker1_RunWorkerCompleted;
} private XmlDocument document = null; private void BackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Set progress bar to 100% in case it's not already there.
progressBar1.Value = 100; if (e.Error == null)
{
MessageBox.Show(document.InnerXml, "下載完成");
}
else
{
MessageBox.Show("無法下載檔案,下載失敗", "下載檔案", MessageBoxButtons.OK, MessageBoxIcon.Error);
} // Enable the download button and reset the progress bar.
btnDownload.Enabled = true;
progressBar1.Value = 0;
} private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
document = new XmlDocument(); Thread.Sleep(10000); // Replace this file name with a valid file name.
document.Load(@"http://www.tailspintoys.com/sample.xml");
} private void Form1_Load(object sender, EventArgs e)
{ } private void btnDownload_Click(object sender, EventArgs e)
{
// Start the download operation in the background.
backgroundWorker1.RunWorkerAsync(); // Disable the button for the duration of the download.
btnDownload.Enabled = false; // Once you have started the background thread you
// can exit the handler and the application will
// wait until the RunWorkerCompleted event is raised. // Or if you want to do something else in the main thread,
// such as update a progress bar, you can do so in a loop
// while checking IsBusy to see if the background task is
// still running.
while (this.backgroundWorker1.IsBusy)
{
progressBar1.Increment(1);
// Keep UI messages moving, so the form remains
// responsive during the asynchronous operation.
Application.DoEvents();
// 避免 CPU 飆高
Thread.Sleep(1);
}
}
}
}

  

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; using System.Threading; namespace BackgroundWorkerSimple
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
} private void Form1_Load(object sender, EventArgs e)
{
backgroundWorker1.DoWork += BackgroundWorker1_DoWork;
backgroundWorker1.ProgressChanged += BackgroundWorker1_ProgressChanged;
backgroundWorker1.RunWorkerCompleted += BackgroundWorker1_RunWorkerCompleted;
} private void BackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
lblResult.Text = "取消";
else if (e.Error != null)
lblResult.Text = "錯誤訊息: " + e.Error.Message;
else
lblResult.Text = "完成";
} private void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
lblResult.Text = $"已完成進度:{e.ProgressPercentage}%";
} private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker; for (int i = 1; i <= 10; i++)
{
if (worker.CancellationPending == true)
{
e.Cancel = true;
break;
} // Perform a time consuming operation and report progress.
Thread.Sleep(500);
worker.ReportProgress(i * 10);
}
} private void btnStartAsync_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy == true) return;
// Start the asynchronous operation.
backgroundWorker1.RunWorkerAsync();
} private void btnCancelAsync_Click(object sender, EventArgs e)
{
// WorkerSupportsCancellation 屬性為 true,才可以執行 CancelAsync method
if (backgroundWorker1.WorkerSupportsCancellation == false) return;
// Cancel the asynchronous operation.
backgroundWorker1.CancelAsync();
}
}
}

  

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; using System.IO; namespace WalkthroughBackgroundWorker
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// 屬性設定
// 使用 ReportProgress() 必須把 WorkerReportsProgress 設為 true
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true; // 事件註冊
backgroundWorker1.RunWorkerCompleted += BackgroundWorker1_RunWorkerCompleted;
backgroundWorker1.ProgressChanged += BackgroundWorker1_ProgressChanged;
backgroundWorker1.DoWork += BackgroundWorker1_DoWork; txtSourceFile.Text = @"D:\Sample.txt";
txtCompareString.Text = "21934";
CounterReset();
ButtonControl(true);
}
private void StartThread()
{
CounterReset(); Words WC = new Words();
WC.SourceFile = txtSourceFile.Text.Trim();
WC.CompareString = txtCompareString.Text.Trim(); // RunWorkerAsync() 會觸發 DoWork Event
backgroundWorker1.RunWorkerAsync(WC);
}
private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// This event handler is where the actual work is done.
// This method runs on the background thread.
BackgroundWorker worker = (BackgroundWorker)sender;
Words WC = (Words)e.Argument;
WC.CountWords(worker, e);
}
private void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// This method runs on the main thread.
// 更新統計資訊
Words.CurrentState state =
(Words.CurrentState)e.UserState;
txtLinesCounted.Text = state.LinesCounted.ToString();
txtWordsCounted.Text = state.WordsMatched.ToString();
}
private void BackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// This event handler is called when the background thread finishes.
// This method runs on the main thread.
if (e.Error != null)
MessageBox.Show("錯誤訊息:" + e.Error.Message);
else if (e.Cancelled)
MessageBox.Show("字數統計取消");
else
MessageBox.Show("完成字數統計"); ButtonControl(true);
}
private void btnStart_Click(object sender, EventArgs e)
{
if (File.Exists(txtSourceFile.Text.Trim()) == false)
{
MessageBox.Show("該檔案路徑不存在,無法進行解析", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
} ButtonControl(false);
StartThread();
}
private void btnCancel_Click(object sender, EventArgs e)
{
// 取消非同步操作
backgroundWorker1.CancelAsync();
CounterReset();
ButtonControl(true);
}
private void ButtonControl(bool state)
{
btnStart.Enabled = state;
btnCancel.Enabled = !state;
}
private void CounterReset()
{
txtWordsCounted.Text = "0";
txtLinesCounted.Text = "0";
}
private void btnFileSelect_Click(object sender, EventArgs e)
{
OpenFileDialog fd = new OpenFileDialog();
fd.Filter = "txt 檔案 (*.*)|*.txt";
fd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
if (fd.ShowDialog() == DialogResult.Cancel) return;
txtSourceFile.Text = fd.FileName;
}
}
}

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Text.RegularExpressions;
using System.ComponentModel;
using System.IO;
using System.Threading; namespace WalkthroughBackgroundWorker
{
public class Words
{
// Object to store the current state, for passing to the caller.
public class CurrentState
{
public int LinesCounted { get; set; }
public int WordsMatched { get; set; }
} public string SourceFile { get; set; }
public string CompareString { get; set; }
private int WordCount { get; set; }
private int LinesCounted { get; set; } public void CountWords(BackgroundWorker worker, DoWorkEventArgs e)
{
if (string.IsNullOrEmpty(CompareString))
throw new Exception("沒有指定搜尋字串"); // 變數初始化
CurrentState state = new CurrentState();
string line = string.Empty;
// int elapsedTime = 20;
// DateTime lastReportDateTime = DateTime.Now; // 利用 StreamReader 讀取 txt 檔案
using (StreamReader sr = new StreamReader(SourceFile))
{
// Process lines while there are lines remaining in the file.
while (!sr.EndOfStream)
{
// 使用者取消後,就不繼續讀取
if (worker.CancellationPending == true)
{
e.Cancel = true;
break;
} line = sr.ReadLine();
WordCount += CountInString(line, CompareString);
// 紀錄行數
LinesCounted++; // Raise an event so the form can monitor progress.
// 每 20 毫秒才透過 ReportProgress() 觸發 ProgressChanged Event,避免觸發太過頻繁
//int compare = DateTime.Compare(
// DateTime.Now,
// lastReportDateTime.AddMilliseconds(elapsedTime));
//if (compare < 0) continue; state.LinesCounted = LinesCounted;
state.WordsMatched = WordCount;
worker.ReportProgress(0, state);
// 重置 lastReportDateTime 變數
// lastReportDateTime = DateTime.Now;
// 處理每一行都停止 50 毫秒,方便觀察執行結果
Thread.Sleep(50);
} // Report the final count values.
state.LinesCounted = LinesCounted;
state.WordsMatched = WordCount;
worker.ReportProgress(100, state);
}
} private int CountInString(string SourceString, string CompareString)
{
// This function counts the number of times
// a word is found in a line.
if (SourceString == null)
{
return 0;
} // Regex.Escape:以逸出碼取代 (\、*、+、?、|、{、[、(、)、^、$、.、# 和泛空白字元) 等字元。 這樣會指示規則運算式引擎將這些字元解譯為常值,而非解譯為中繼字元。
string EscapedCompareString = Regex.Escape(CompareString); // To count all occurrences of the string, even within words, remove both instances of @"\b" from the following line.
// 下述兩種寫法都可以使用
string pattern = @"\b" + EscapedCompareString + @"\b";
// string pattern = $"\\b{EscapedCompareString}\\b"; Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection matches = regex.Matches(SourceString);
return matches.Count;
}
}
}

  

最新文章

  1. win32+ apache2.2 + tomcat7配置
  2. CF 405C Unusual Product(想法题)
  3. 关于笔记本安装双系统windows and linux
  4. 知问前端——概述及jQuery UI
  5. IOS 系统API---NSJSONSerialization四个枚举什么意思
  6. POJ-2442 Sequence K路归并问题
  7. sql 删除表数据truncate delete drop的区别
  8. 干货!如何正确使用Git Flow
  9. Git使用记录(二)
  10. 【双模卡的相关知识】解SIM卡前需要知道的信息(SIM年分和厂商识别)
  11. json所需jar包 &amp; js解析后台json数据
  12. 微信小程序xml解析
  13. 【一天一道LeetCode】#46. Permutations
  14. [转载]ECMall模板解析语法与机制
  15. burpsuit 无法导入证书,抓取https的解决办法
  16. 阿里云ECS安装的redis服务器,用java代码去连接报错。
  17. CentOS之正则表达式
  18. go语言之进阶篇创建goroutine协程
  19. WebDriver API 实例详解(一)
  20. YUM本地源制作与yum网络版仓库

热门文章

  1. YIi2中checkboxOptions前选框的用法
  2. delphi 数据处理
  3. error C2065: CoInitializeEx&#39; : undeclared identifier 解决方法
  4. 杂项-笔记-VS:VS2019笔记
  5. Tomcat运行错误示例三
  6. delphi基础篇之数据类型概论
  7. arttemplate 后台返回的数据格式问题
  8. 2.5 webpack 进阶
  9. 拾遗:Git 常用操作回顾
  10. 拾遗:编译安装 vim