1. 程式人生 > >C#多執行緒 BackgroundWorker類使用小例-WPF程式

C#多執行緒 BackgroundWorker類使用小例-WPF程式

1.程式實現了一個簡單的使用了BackgroundWorker類的WPF程式,用於在後臺執行緒給進度條賦值。

執行結果如下:

後臺執行緒正常執行結束:


後臺執行緒中途被取消:


2.程式僅修改了 MainWindow.xaml 檔案和 MainWindow.xaml.cs 檔案,兩個檔案內容如下

MainWindow.xaml 檔案:

<Window x:Class="SimpleWorker.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="150" Width="250">
    <StackPanel>
        <ProgressBar Name="progressBar" Height="20" Width="200" Margin="10"></ProgressBar>
        <Button Name="btnProcess" Width="100" Click="btnProcess_Click" Margin="5">開始後臺任務</Button>
        <Button Name="btnCancel" Width="100" Click="btnCancel_Click" Margin="5">取消後臺任務</Button>
    </StackPanel>
</Window>

ainWindow.xaml.cs 檔案:
using System.Windows;
using System.ComponentModel;
using System.Threading;

namespace SimpleWorker
{
    /// <summary>
    /// MainWindow.xaml 的互動邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        BackgroundWorker bgWorker = new BackgroundWorker();
        public MainWindow()
        {
            InitializeComponent();

            bgWorker.WorkerReportsProgress = true;
            bgWorker.WorkerSupportsCancellation = true;
            bgWorker.DoWork += DoWork_Handler;
            bgWorker.ProgressChanged += ProgressChanged_Handler;
            bgWorker.RunWorkerCompleted += RunWorkerCompleted_Handler;
        }

        private void btnProcess_Click(object sender,RoutedEventArgs e)
        {
            if (!bgWorker.IsBusy)
            {
                bgWorker.RunWorkerAsync();
            }
        }

        private void ProgressChanged_Handler(object sender, ProgressChangedEventArgs args)
        {
            progressBar.Value = args.ProgressPercentage;
        }

        private void DoWork_Handler(object sender,DoWorkEventArgs args)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            for (int i = 1; i <= 10; i++)
            {
                if (worker.CancellationPending)
                {
                    args.Cancel = true;
                    break;
                }
                else
                {
                    worker.ReportProgress(i*10);
                    Thread.Sleep(500);
                }
            }
        }

        private void RunWorkerCompleted_Handler(object sender,RunWorkerCompletedEventArgs args)
        {
            progressBar.Value = 0;
            if (args.Cancelled)
            {
                MessageBox.Show("後臺任務已經被取消。", "訊息");
            }
            else
            {
                MessageBox.Show("後臺任務正常結束。","訊息");
            }
        }
        private void btnCancel_Click(object sender,RoutedEventArgs e)
        {
            bgWorker.CancelAsync();
        }
    }
}

相關推薦

C#執行 BackgroundWorker使用-WPF程式

1.程式實現了一個簡單的使用了BackgroundWorker類的WPF程式,用於在後臺執行緒給進度條賦值。 執行結果如下: 後臺執行緒正常執行結束: 後臺執行緒中途被取消: 2.程式僅修改了 MainWindow.xaml 檔案和 MainWindow.xaml.

C++執行安全的問題

我們是多麼渴望各種C++類都是多執行緒安全的,然而一旦涉及到物件間的互動,這樣的渴望可能就只能是奢望了。下面,我們以設計一個雙向鏈結點為例,看看要使其多執行緒安全將會帶來一些什麼問題。 class DoublyLinedNode{ DoublyLinedNode* pPrev

c# 執行使用佇列順序寫日誌的 (需要再優化)

using System; using System.Collections.Generic; using System.Threading; public class LogManager { /// <summary> /// 建構函式 /// </su

C#執行基礎知識和實踐

源文來源 :http://www.cnblogs.com/jackson0714/p/5100372.html 一、多執行緒介紹 C#通過多執行緒支援並行執行的程式碼。一個執行緒是一個獨立執行的路徑,可以同時與其他執行緒一起執行。一個C#客戶端程式(Console,WPF,W

簡單的Linux C++執行CLOCK(時鐘)

剛剛加入CSDN部落格,初來乍到也不知道寫什麼,所以來分享一個自己以前學C++的時候寫的第一個類,一個關於時鐘的簡單的Linux多執行緒CLOCK(時鐘)類: /***********************************************

C# 執行啟動和管理 單模式

1.          List<Task> taskList = new List<Task>();             TaskFactory t

C# 執行九之Timer

1、簡介 相信寫過定時任務的小夥伴都知道這個類,非常的輕量級,而且FCL中大量的類使用了這個方法,比如CancellationTokenSource的CancelAfter就是用Timer去做的. 當然FCL中大量的使用了Timer,說明MS對Timer類是信任的.下面就開始介紹這個類的用法.簡介很少

執行下實現單

    這兩天在看自己之前寫的程式碼,所以正好把用過的東西整理一下,單例模式,在日常的程式碼工作中也是經常被用到, 所以這裡把之前用過的不同方式實現的單例方式整理一下  

執行 繼承Thread 實現Runnable介面 執行安全 synchronized 單設計懶漢 鎖死

程序 是一個正在執行中的程式。 每個程序執行都有一個執行順序,該順序是一個執行路徑,或者叫一個控制單元。 舉例子:一個程序,就是一個正在執行的程式。 執行緒 就是程序中的一個獨立的控制單元。 執行緒在

Win32下兩種用於C++的執行同步(執行實現加鎖解鎖)

使用Win32提供的臨界區可以方便的實現執行緒鎖: // 全域性: CRITICAL_SECTION cs; InitializeCriticalSection( & cs); // 執行緒1: EnterCriticalSection(

C#執行程式設計筆記(2.5)-使用CountDownEvent

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^using System; using System.Threading; namespace CountDownEvent_Test { class Pr

C#執行程式設計筆記(2.7)-使用ReaderWriterLockSlim

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^using System; using System.Collections.Generic; using System.Threading; namespace

C#執行程式設計筆記(2.1)-使用Mutex

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^Mutex是一種原始的同步方法,其只對一個執行緒授予對共享資源的獨佔訪問using System; using System.Threading; namespac

C# 單執行執行下的單模式的實現

該單例模式是執行緒不安全的,只能在單執行緒下執行,在多執行緒中如果被兩個執行緒同時呼叫Instance屬性時,此時兩個執行緒判斷 if (_instance==null)時都會返回true,就會建立兩個例項。public class Singleton{ /// <

C#執行開發10:執行同步之Semaphore

Semaphore類表示訊號量。 訊號量和互斥類似,只是訊號量可以同時由多個執行緒使用,而互斥只能由一個執行緒使用。也就是說,使用訊號量時,可以多個執行緒同時訪問受保護的資源。下面例項演示了“學生到食

C++執行程式設計(執行)

簡述 通過執行緒類來管理執行緒,實現業務邏輯與執行緒管理分離 原始碼 介面類 SFRunnable.h class SFRunnable { public: virtual ~SFRunnable() {}; vi

C#執行程式設計筆記(2.6)-使用Barrier

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^using System; using System.Threading; namespace Barrier_Test { class Program

C# 執行計時器

該例子是一個封裝的計時器類。 實現功能: (1)傳入一個時間 HH:mm:ss 字串 和 label控制元件物件 即可實現控制元件倒計時。 三行程式碼即可執行,如下圖效果: 當然,每個專案需要的需求不同,這裡只是拋磚引玉。 下面貼出我的程式碼,歡迎討論。 完整程式碼

C#執行程式設計筆記(2.8)-使用SpinWait

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^using System; using System.Threading; namespace SpinWait_Test { class Program

c++靜態程式碼實現執行安全的單模式

開發十年,就只剩下這套架構體系了! >>>