zoukankan      html  css  js  c++  java
  • 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 @"" from the following line. 
    			// 下述兩種寫法都可以使用
    			string pattern = @"" + EscapedCompareString + @"";
    			// string pattern = $"\b{EscapedCompareString}\b";
    
    			Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
    			MatchCollection matches = regex.Matches(SourceString);
    			return matches.Count;
    		}
    	}
    }
    

      

  • 相关阅读:
    Python开发:关于__name__
    学习笔记之cocos2dx2.1.1实现修改plist文件数据,用TinyXml解析XML
    计算机相关书籍推荐(持续更新)
    【C语言】溢出的处理及大小端模式的判断
    使用 MDSD 开发安全可靠的软件
    关于 /dev/null 与 /dev/zero
    NetBeans 时事通讯(刊号 # 108 Jul 08, 2010)
    NetBeans 时事通讯(刊号 # 109 Jul 17, 2010)
    JDK1.6 Update21 下载
    类的内联函数的实现应该放在哪里
  • 原文地址:https://www.cnblogs.com/Jeely/p/11002939.html
Copyright © 2011-2022 走看看