zoukankan      html  css  js  c++  java
  • .net 2.0 BackgroundWorker 文章三篇

     

    View Code
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    BackgroundWorker1.WorkerReportsProgress
    = True
    BackgroundWorker1.WorkerSupportsCancellation
    = True
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim s As String = "线程测试:"
    BackgroundWorker1.RunWorkerAsync(s)
    End Sub


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    BackgroundWorker1.CancelAsync()
    BackgroundWorker1.Dispose()
    End Sub


    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Dim s1 As String = e.Argument.ToString & "后台线程"
    Dim i As Integer = 0
    For i = 0 To 10
    If BackgroundWorker1.CancellationPending Then
    e.Result
    = "用户取消了线程"
    Exit Sub
    Else
    Threading.Thread.Sleep(
    1000)
    BackgroundWorker1.ReportProgress((i
    * 1) / 10 * 100, s1 & " 执行到 " & i)
    End If
    Next
    e.Result
    = "后台线程执行完成"
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    MessageBox.Show(e.Result.ToString)
    End Sub

    Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    ProgressBar1.Value
    = e.ProgressPercentage
    Me.Label1.Text = e.UserState.ToString
    End Sub

    http://www.dotblogs.com.tw/billchung/archive/2009/05/30/8597.aspx

    2、

    int sum=0;   
    private void Form1_Load(object sender, EventArgs e)   
            {   
                BackgroundWorker backWork 
    = new BackgroundWorker();   
                backWork.DoWork 
    += new DoWorkEventHandler(backWork_DoWork);   
                backWork.RunWorkerCompleted 
    += new RunWorkerCompletedEventHandler(backWork_RunWorkerCompleted);   
                backWork.RunWorkerAsync();   
            }   
      
            
    void backWork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)   
            {   
                MessageBox.Show(sum.ToString());   
            }   
      
            
    void backWork_DoWork(object sender, DoWorkEventArgs e)   
            {   
                
    for (long i = 0; i < 1000000000; i++)   
                {   
                    sum 
    += i;   
                }   
            }  


    3、 在WinForm中经常遇到一些费时的操作界面,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成“假死”的情况,或者报“线程间操作无效”的异常,为了解决这个问题,可以使用委托来处理,在.net2.0中还可以用BackgroundWorker类。

    BackgroundWorker类是.net 2.0里新增加的一个类,对于需要长时间操作而不需要用户长时间等待的情况可以使用这个类。
     注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。 

    程序代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    /*
     * 作者:周公
     * BackgroundWorker类是.net 2.0里新增加的一个类,对于需要长时间操作而不需要用户长时间等待的情况可以使用这个类。
     * 注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
     * 它有几个属性:
     * CancellationPending——指示应用程序是否已请求取消后台操作。
     * IsBusy——指示 BackgroundWorker 是否正在运行异步操作
     * WorkerReportsProgress——该值指示 BackgroundWorker 能否报告进度更新
     * WorkerSupportsCancellation——该值指示 BackgroundWorker 是否支持异步取消
     * 还有如下事件:
     * DoWork——调用 RunWorkerAsync 时发生。
     * ProgressChanged——调用 ReportProgress 时发生。
     * RunWorkerCompleted——当后台操作已完成、被取消或引发异常时发生。
     * 
     * 还有如下方法:
     * CancelAsync——请求取消挂起的后台操作
     * ReportProgress——引发 ProgressChanged 事件
     * RunWorkerAsync——开始执行后台操作
     * 
     *
    */
    namespace BackgroundWorkerDemo
    {
        
    public partial class MainForm : Form
        {
            
    private BackgroundWorker worker = new BackgroundWorker();
            
    public MainForm()
            {
                InitializeComponent();
                worker.WorkerReportsProgress 
    = true;
                worker.WorkerSupportsCancellation 
    = true;
                
    //正式做事情的地方
                worker.DoWork+=new DoWorkEventHandler(DoWork);
                
    //任务完称时要做的,比如提示等等
                worker.ProgressChanged += new ProgressChangedEventHandler(ProgessChanged);
                
    //任务进行时,报告进度
                worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompleteWork);
            }

            
    //调用 RunWorkerAsync 时发生
            public void DoWork(object sender, DoWorkEventArgs e)
            {
                e.Result 
    = ComputeFibonacci(worker, e);//当ComputeFibonacci(worker, e)返回时,异步过程结束
            }
            
    //调用 ReportProgress 时发生
            public void ProgessChanged(object sender, ProgressChangedEventArgs e)
            {
                
    this.progressBar1.Value = e.ProgressPercentage;
            }
            
    //当后台操作已完成、被取消或引发异常时发生
            public void CompleteWork(object sender, RunWorkerCompletedEventArgs e)
            {
                MessageBox.Show(
    "完成!");
            }

            
    private int ComputeFibonacci(object sender, DoWorkEventArgs e)
            {
                
    for (int i = 0; i < 1000; i++)
                {
                    
    if (worker.CancellationPending)
                    {
                        e.Cancel 
    = true;
                        return -1;
                    }
                    
    else
                    {
                        worker.ReportProgress(i);
                    }
                    System.Threading.Thread.Sleep(
    10);
                }
                
    return -1;
            }

            
    private void btnStart_Click(object sender, EventArgs e)
            {
                worker.RunWorkerAsync();
                btnStart.Enabled 
    = false;
                btnPause.Enabled 
    = true;
            }

            
    private void btnPause_Click(object sender, EventArgs e)
            {
                btnPause.Enabled 
    = false;
                btnStart.Enabled 
    = true;
                worker.CancelAsync();
            }
        }
    }
  • 相关阅读:
    Python3---内建函数---all()
    (dp)Codeforces Round #418 (Div. 2) C. An impassioned circulation of affection
    (状压dp)codevs2800 送外卖
    (dp)CF 813 Educational Codeforces Round 22 D. Two Melodies
    (线段树)CF813 Educational Codeforces Round 22 E
    (trie)HDU1251 统计难题
    (最大流)CodeForces
    (高斯消元)HDU2827 The Evaluation of Determinant
    (三分)HDU5531 Rebuild
    (并查集)Codeforces 325 D-Reclamation
  • 原文地址:https://www.cnblogs.com/LCX/p/1422372.html
Copyright © 2011-2022 走看看