BackgroundWorker study
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;
}
}
}
BackgroundWorker study的更多相关文章
- C# BackgroundWorker 详解
		
在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题.解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算操作放在这个后台线程中完 ...
 - 【Winform】使用BackgroundWorker控制进度条显示进度
		
许多开发者看见一些软件有进度条显示进度,自己想弄,项目建好后发现并没有自己想象中的那么简单...看了网上很多教程后,写了一个小Demo供网友们参考~~,Demo的网址:http://pan.baidu ...
 - Improve Your Study Habits
		
1.Plan your time carefully. Make a list of your weekly tasks.Then make a schedule or chart of your t ...
 - C# 多線程&BackgroundWorker概念入門教程
		
感謝以下各位作者的貢獻~ 百度經驗舉了個例子,很好理解BackgroundWorker的用途(主要是用來啟動後台線程,而不阻塞調用程式的運行),收藏一下 http://jingyan.baidu.c ...
 - 【C#】【Thread】BackgroundWorker的使用
		
BackgroundWorker 可以用于启动后台线程. 主要的事件及参数: 1.DoWork --当执行BackgroundWorker.RunWorkerAsync方法时会触发该事件,并且传递Do ...
 - 用于异步的BackgroundWorker
		
XAML代码: <Window x:Class="backgroundtest.MainWindow" xmlns="http://schemas.microsof ...
 - C# 使用BackgroundWorker例子及注意点
		
该例子为使用BackgroundWorker在TextBox文本中产生一个10000以内并且能被5整除的数(1秒产生一个) 操作界面可以启动线程,也可以停止线程,界面设计如图: 先贴代码,有注释的地方 ...
 - C# BackgroundWorker组件学习入门介绍
		
C# BackgroundWorker组件学习入门介绍 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能 ...
 - winform异步系统升级—BackgroundWorker
		
BackgroundWorker用法实例 自己的代码,就是要执行的代码写到dowork里,ProgressChanged事件是控制进度时用的,最后的Completed事件进度完成,也就是dowork里 ...
 
随机推荐
- 【LeetCode 13】罗马数字转整数
			
题目链接 [题解] 就是上一题反过来的过程. 因为有说一般情况下后面的罗马数字是小于前面的罗马数字的. 如果前面的罗马数字小于后面的罗马数字了. 说明出现了4,9,40,90这些特殊情况. 那么就得判 ...
 - Shell基础(六):使用awk提取文本、awk处理条件、awk综合脚本应用、awk流程控制、awk扩展应用
			
一.使用awk提取文本 目标: 本案例要求使用awk工具完成下列过滤任务: 1> 练习awk工具的基本用法 2> 提取本机的IP地址.根分区使用率 3> 格式化输出/et ...
 - visual_c++外挂教程(详细)
			
课程分四个大章节 初级篇,中级篇,进阶篇,高级篇 初级篇内容:编写一个完整的,简单的外挂 C++的数据类型:Byte,Word,DWORD,int,float API函数的调mouse_event,G ...
 - 解决Office 2010 每次打开word时出现配置进度框
			
来自百度经验 装好Office 2010后,每次打开都会出现配置进度框,很烦人,怎么办呢 确认你的10版Office已激活,激活状态如图(激活工具一般在你下载的安装包里都有) 直接在”开始“运行框里输 ...
 - Jenkins和Docker
			
由于采用了Docker版的Jenkins,导致在Jenkins里无法调用Docker命令行工具进行Docker镜像构建 有三种解决方案: 1. 安装Docker插件,利用Jenkins插件进行构建 2 ...
 - Keepalived 双主虚拟路由配置实例
			
Keepalived 双主虚拟路由配置实例 演示前说明: 2台centos7.2 主机:node-00,node-01 VIP1:10.1.38.19预定node-00占有 VIP2:10.1.38. ...
 - jetson更换源
			
参考链接:https://blog.csdn.net/qq_36396941/article/details/88903094 Nano的镜像默认是国外的源,速度很慢,国内的源有的上不去,有的包无法安 ...
 - spring mvc 配置后,web中的html页面报404,该怎么处理
			
问题描述: 在根目录webapp下的jsp页面可以通过url直接访问,而html页面就会报404错误. 解决方案1: 在spring-mvc.xml中添加如下配置: <!--将静态文件指定到某个 ...
 - 2019-9-11-.NET-Standard
			
title author date CreateTime categories .NET Standard lindexi 2019-9-11 9:0:29 +0800 2019-9-11 9:0:2 ...
 - LVS DR模拟实验
			
准备多台服务器,现以三台服务器为例第一台做调度器 192.168.200.111[root@localhost ~]# iptables -F[root@localhost ~]# setenforc ...