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的更多相关文章

  1. C# BackgroundWorker 详解

    在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题.解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算操作放在这个后台线程中完 ...

  2. 【Winform】使用BackgroundWorker控制进度条显示进度

    许多开发者看见一些软件有进度条显示进度,自己想弄,项目建好后发现并没有自己想象中的那么简单...看了网上很多教程后,写了一个小Demo供网友们参考~~,Demo的网址:http://pan.baidu ...

  3. 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 ...

  4. C# 多線程&BackgroundWorker概念入門教程

    感謝以下各位作者的貢獻~ 百度經驗舉了個例子,很好理解BackgroundWorker的用途(主要是用來啟動後台線程,而不阻塞調用程式的運行),收藏一下  http://jingyan.baidu.c ...

  5. 【C#】【Thread】BackgroundWorker的使用

    BackgroundWorker 可以用于启动后台线程. 主要的事件及参数: 1.DoWork --当执行BackgroundWorker.RunWorkerAsync方法时会触发该事件,并且传递Do ...

  6. 用于异步的BackgroundWorker

    XAML代码: <Window x:Class="backgroundtest.MainWindow" xmlns="http://schemas.microsof ...

  7. C# 使用BackgroundWorker例子及注意点

    该例子为使用BackgroundWorker在TextBox文本中产生一个10000以内并且能被5整除的数(1秒产生一个) 操作界面可以启动线程,也可以停止线程,界面设计如图: 先贴代码,有注释的地方 ...

  8. C# BackgroundWorker组件学习入门介绍

    C# BackgroundWorker组件学习入门介绍 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能 ...

  9. winform异步系统升级—BackgroundWorker

    BackgroundWorker用法实例 自己的代码,就是要执行的代码写到dowork里,ProgressChanged事件是控制进度时用的,最后的Completed事件进度完成,也就是dowork里 ...

随机推荐

  1. Shiro学习(9)JSP标签

    Shiro提供了JSTL标签用于在JSP/GSP页面进行权限控制,如根据登录用户显示相应的页面按钮. 导入标签库 Java代码   <%@taglib prefix="shiro&qu ...

  2. linux python3 venv 虚拟环境报错 [-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 2.

    解决办法: 先创建没有pip的虚拟环境,然后启动虚拟环境后,再安装pip 办法一: 亲测失败了... python3 -m venv --without-pip py36env 办法二 sudo ap ...

  3. c# 使用 java的 rsa 进行签名

    /// <summary> /// 类名:RSAFromPkcs8 /// 功能:RSA加密.解密.签名.验签 /// 详细:该类对Java生成的密钥进行解密和签名以及验签专用类,不需要修 ...

  4. Dubbo入门到精通学习笔记(三):持续集成管理平台之SVN版本管理系统的安装和使用

    文章目录 持续集成管理平台介绍 持续集成介绍 持续集成管理平台的组成 持续集成实践介绍 即将学习 SVN版本管理系统的安装 安装 Subversion + Apache 安装 jsvnadmin 简单 ...

  5. 广度优先搜索(Breadth First Search)

    Date:2019-07-03 14:29:02 走完一层的所有房间,再走下一层,用队列实现 算法实现 /*--------------------------模版------------------ ...

  6. 剑指offer——62数组种数字出现的次数

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题解: 我们想到异或运算的一个性质:任何一个数字异或它自己都等于0.也就是说,如果我们从头到尾依 ...

  7. MySQL数据库(六) —— SQL注入攻击、视图、事物、存储过程、流程控制

    SQL注入攻击.视图.事物.存储过程.流程控制 一.SQL注入攻击 1.什么是SQL注入攻击 import pymysql conn = pymysql.Connect( user="roo ...

  8. Ubuntu12.04下删除文件夹内所有的.svn文件

    前段时间在公司里遇到一个问题,从svn上下载下来的文件含有.svn文件,如何删除当前目录下的所有.svn文件呢? 一个个手动删除显然不可能,太多了.其实在Ubuntu12.04下延伸至其他所搜的Lin ...

  9. JDK8新特性之Stream流

    是什么是Stream流 java.util.stream.Stream Stream流和传统的IO流,它们都叫流,却是两个完全不一样的概念和东西. 流可以简单的说是处理数据集合的东西,可以申明式流式A ...

  10. SDL系列之 - 用画直线的方法来画正弦曲线

    线段长度无限短后就成为点,所以,现在让我们用画直线的方法来画正弦曲线吧 #include <SDL.h> #include <stdlib.h> #include <st ...