C#多线程 BackgroundWorker类使用小例-控制台程序

1. 示例程序 是一个控制台应用程序,程序实现了分别在主线程和后台线程并行执行,达到为数组赋值的效果。

  可以中途停止后台线程。

2. 执行结果图片如下:

正常执行结束:

中途停止后台线程:

3.代码

 

[csharp] view plain copy
 
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Text;  
    5. using System.ComponentModel;  
    6. using System.Threading;  
    7.   
    8. namespace BackgroundWorker多线程  
    9. {  
    10.     class DoBackgroundwork  
    11.     {  
    12.         BackgroundWorker bgWorker = new BackgroundWorker();         
    13.         public int[] backArray{get;private set;}  
    14.         public bool CompletedNormally { get; private set; }  
    15.          
    16.         //构造方法  
    17.         public DoBackgroundwork(int[] array)  
    18.         {  
    19.             this.backArray = array;  
    20.   
    21.             bgWorker.WorkerReportsProgress = true;  
    22.             bgWorker.WorkerSupportsCancellation = true;  
    23.   
    24.             bgWorker.DoWork += DoWork_Handler;  
    25.             bgWorker.ProgressChanged += ProgressChanged_Handler;  
    26.             bgWorker.RunWorkerCompleted += RunWorkerCompleted_Handler;  
    27.         }  
    28.   
    29.         public void StartWorker()  
    30.         {  
    31.             if (!bgWorker.IsBusy)  
    32.             {  
    33.                 bgWorker.RunWorkerAsync();  
    34.             }  
    35.         }  
    36.          
    37.         public static int[] CalculateTheSequence(int[] array)  
    38.         {  
    39.             for (int i = 0; i < array.Length; i++)  
    40.             {  
    41.                 array[i] = 10 * i;  
    42.             }  
    43.             return array;  
    44.         }  
    45.   
    46.         public void DoWork_Handler(object sender, DoWorkEventArgs args)  
    47.         {  
    48.             BackgroundWorker worker = sender as BackgroundWorker;  
    49.             //进行后台计算  
    50.             for (int i = 0; i < 10; i++)  
    51.             {  
    52.                 //每一次迭代都检查是否已经取消  
    53.                 if (worker.CancellationPending)  
    54.                 {  
    55.                     args.Cancel = true;  
    56.                     worker.ReportProgress(-1);  
    57.                     break;  
    58.                 }  
    59.                 else  
    60.                 {  
    61.                     //如果没有被取消则继续计算  
    62.                     CalculateTheSequence(backArray);  
    63.                     worker.ReportProgress((i+1)*10);  
    64.   
    65.                     //让程序慢点,这样可以输出得漂亮一点  
    66.                     Thread.Sleep(100);  
    67.                 }  
    68.             }  
    69.         }  
    70.   
    71.         //处理后台线程的输入  
    72.         private void ProgressChanged_Handler(object sender,ProgressChangedEventArgs args)  
    73.         {  
    74.             string output = args.ProgressPercentage == -1 ? "            Cancelled" : string.Format("            back: {0}%        ", args.ProgressPercentage);  
    75.             Console.WriteLine(output);  
    76.         }  
    77.   
    78.         //后台线程完成之后,总结并保存总和  
    79.         private void RunWorkerCompleted_Handler(object sender,RunWorkerCompletedEventArgs args)  
    80.         {  
    81.             CompletedNormally = !args.Cancelled;  
    82.         }  
    83.   
    84.         public void Cancel()  
    85.         {  
    86.             if(bgWorker.IsBusy)  
    87.             {  
    88.                 bgWorker.CancelAsync();  
    89.             }  
    90.         }  
    91.   
    92.     }  
    93.   
    94.     class Program  
    95.     {          
    96.         static void Main()  
    97.         {  
    98.             GiveInstructionsToTheUser();  
    99.             OutputTheSummaryHeaders();  
    100.   
    101.             //创建并启动后台线程  
    102.             int[] backArray=new int[10];  
    103.             DoBackgroundwork bgw = new DoBackgroundwork(backArray);  
    104.             bgw.StartWorker();  
    105.   
    106.             //主线程启动计算,对每一次循环,检查用户是否已经取消了后台线程  
    107.             //计算之后,进行短暂的休眠,这样程序可以慢一点,使得主线程不会比后台线程更快  
    108.   
    109.             int[] mainArray = new int[10];  
    110.             for (int i = 0; i < 10; i++)  
    111.             {  
    112.                 if (Program.CheckForCancelInput())  
    113.                     bgw.Cancel();  
    114.   
    115.                 CalculateTheSequenceMain(mainArray);  
    116.                 Thread.Sleep(100);  
    117.                 Console.WriteLine("main: {0}%", (i + 1) * 10);  
    118.             }  
    119.             SummarizeResults(bgw, mainArray);  
    120.             Console.ReadLine();            
    121.         }  
    122.   
    123.         public static void GiveInstructionsToTheUser()  
    124.         {  
    125.             Console.WriteLine("本程序分别在主线程和后台线程并行计算两个数组的值。\n");  
    126.             Console.WriteLine("第一次按下 <Enter> 键开始执行主线程main和后台线程back.");  
    127.             Console.WriteLine("第二次按下 <Enter> 键停止执行后台线程back.");  
    128.             Console.ReadLine();  
    129.         }  
    130.   
    131.         public static void OutputTheSummaryHeaders()  
    132.         {  
    133.             Console.WriteLine("------------------------");  
    134.         }  
    135.   
    136.         private static void SummarizeResults(DoBackgroundwork bgw, int[] mainArray)  
    137.         {  
    138.             Console.WriteLine("\n\n运行结果:");  
    139.             Console.WriteLine("Main completed!");  
    140.             for (int i = 0; i < mainArray.Length;i++ )  
    141.             {  
    142.                 Console.WriteLine("mainArray[" + i + "]:  " + mainArray[i]);  
    143.             }  
    144.             if (bgw.CompletedNormally)  
    145.             {  
    146.   
    147.                 Console.WriteLine("\nBackground completed!");  
    148.                 for (int i = 0; i < bgw.backArray.Length; i++)  
    149.                 {  
    150.                     Console.WriteLine("backArray[" + i + "]:  " + bgw.backArray[i]);  
    151.                 }                 
    152.             }  
    153.             else  
    154.             {  
    155.                 Console.WriteLine("\nBackground Cancelled。");  
    156.             }  
    157.               
    158.         }  
    159.   
    160.         public static bool CheckForCancelInput()  
    161.         {  
    162.             bool doCancel = Console.KeyAvailable;  
    163.             if (doCancel)  
    164.                 Console.ReadKey();  
    165.             return doCancel;  
    166.         }  
    167.   
    168.         public static int[] CalculateTheSequenceMain(int[] array)  
    169.         {  
    170.             for (int i = 0; i < array.Length; i++)  
    171.             {  
    172.                 array[i] = i * i;  
    173.             }  
    174.             return array;  
    175.         }  
    176.     }  
    177. }  

posted on 2017-06-09 09:04  alex5211314  阅读(377)  评论(0)    收藏  举报

导航