<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近專案要用到,表單Form程式要在後臺開啟幾個子執行緒,負責和其他端進行通訊,非同步讀寫,並且來更改UI。在網上查了有Backgroundworker與Thread兩種方法。
BackgroundWorker是微軟的在.net Framwork中新增的一個元件,主要對執行緒的存取提供了一種安全的方式。簡單的說就是對Thread的一次封裝。
首先介紹一下BackgroundWorker的相關屬性和方法:
屬性:
方法:
事件:
一個簡單的例子:
public partial class MainWindow : Window { private BackgroundWorker m_BackgroundWorker;// 申明後臺物件 public MainWindow() { InitializeComponent(); m_BackgroundWorker = new BackgroundWorker(); // 範例化後臺物件 m_BackgroundWorker.WorkerReportsProgress = true; // 設定可以通告進度 m_BackgroundWorker.WorkerSupportsCancellation = true; // 設定可以取消 m_BackgroundWorker.DoWork += new DoWorkEventHandler(DoWork); m_BackgroundWorker.ProgressChanged += new ProgressChangedEventHandler(UpdateProgress); m_BackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompletedWork); m_BackgroundWorker.RunWorkerAsync(this); } void DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker bw = sender as BackgroundWorker; MainWindow win = e.Argument as MainWindow; int i = 0; while ( i <= 100 ) { if (bw.CancellationPending) { e.Cancel = true; break; } bw.ReportProgress(i++); Thread.Sleep(1000); } } void UpdateProgress(object sender, ProgressChangedEventArgs e) { int progress = e.ProgressPercentage; label1.Content = string.Format("{0}",progress); } void CompletedWork(object sender, RunWorkerCompletedEventArgs e) { if ( e.Error != null) { MessageBox.Show("Error"); } else if (e.Cancelled) { MessageBox.Show("Canceled"); } else { MessageBox.Show("Completed"); } } private void button1_Click(object sender, RoutedEventArgs e) { m_BackgroundWorker.CancelAsync(); } }
BackgroundWorker就是一個高階控制元件,方便使用Thread,後者是前者的靈魂或基礎
直接使用後者難度稍大,但換來的是靈活方便。
Thread的使用就比較麻煩了,對於尤其是對非同步提醒來說,需要寫委託,程式碼量是很多,但是對於BackgroundWorker來說,卻沒有執行緒暫停和繼續的方法。但是對於一般的來說,這些功能也是不用的,而且在微軟的檔案中還提到了,Thread的Resume和Suspend已經不推薦使用。
一個簡單的例子:
using System; using System.Threading; namespace ThreadsComm { public delegate void ReadParamEventHandler(string sParam); class MyThread { public Thread thread1; private static ReadParamEventHandler OnReadParamEvent; public MyThread() { thread1 = new Thread(new ThreadStart(MyRead)); thread1.IsBackground = true; thread1.Start(); } public event ReadParamEventHandler ReadParam { add { OnReadParamEvent += new ReadParamEventHandler(value);} remove{ OnReadParamEvent -= new ReadParamEventHandler(value);} } protected void MyRead() { int i = 0; while (true) { Thread.Sleep(1000); i = i + 1; OnReadParamEvent(i.ToString());//觸發事件 } } } } using System; using System.Windows.Forms; namespace ThreadsComm { public partial class Form1 : Form { private static string param = ""; public Form1() { InitializeComponent(); MyThread thread1 = new MyThread(); thread1.ReadParam += this.OnRead; } private void OnRead(string sParam) { param = sParam; Object[] list = { this,System.EventArgs.Empty}; this.lblShow.BeginInvoke(new EventHandler(LabelShow), list); } protected void LabelShow(Object o, EventArgs e) { this.lblShow.Text = param; } } }
當你執行的任務較簡單,不需要複雜控制時使用BackgroundWorker,較為方便;當你要執行的任務需要複雜控制(如執行緒同步)時,要自己 建立執行緒。畢竟,如果我們要實用多個執行緒,還需要往表單中加好幾個BackgroundWorker控制元件。
到此這篇關於C#中Backgroundworker與Thread的區別的文章就介紹到這了,更多相關C# Backgroundworker與Thread內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45