zoukankan      html  css  js  c++  java
  • c# BackgroundWorker控件使用方法


    在使用之前先了解一些知識。

    1、BackgroundWorker作用:

        主要用在單獨的線程上執行操作。BackgroundWorker类允许您在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker类方便地解决问题。


    2、BackgroundWorker常用屬性:

    名稱

    說明

    CancellationPending

    指示應用程式是否已請求取消後台操作即(是否正在停止中)

    IsBusy

    獲取一個值,指示 BackgroundWorker 是否正在運行非同步操作。

    WorkerReportsProgress

    該值指示 BackgroundWorker 能否報告進度更新。

    WorkerSupportsCancellation

    該值指示 BackgroundWorker 是否支援非同步取消。


    3、BackgroundWorker常用事件:

    控制項

    名稱

    說明

    TextBox

    txtSelect

    用於顯示被選擇文件的路徑

    Button

    btnSelectFile

    用於選擇文件

    TextBox

    txtResult

    用於顯示後台程式執行的結果

    ProgressBar

    pgbValue

    用於顯示背景程式執行的結果

    Button

    btnRun

    用於執行背景程式

    Button

    btnCancel

    用於取消正在執行的背景程式

    BackgroundWorker

    bgwWorker

    用於後台運行程式


    4、注意:

                運行RunWorkerAsync()方法會觸發DoWork事件
                運行ReportProgress()方法會觸發ProgressChanged事件

    5、使用過程:

          5.1 在窗體中加入控件
    5.2 加入
    BackgroundWorker的事件
    5.3 在DoWork事件的方法中調用需要執行的方法
    5.4 在ProgressChanged事件的方法中顯示進度
    5.5 在RunWorkerCompleted事件的方法中顯示被執行方法的結果

    6、代碼:

        6.1 代碼中的控件說明:

    控件

    名稱

    說明

    TextBox

    txtSelect

    用於顯示被選擇文件的路徑

    Button

    btnSelectFile

    用於選擇文件

    TextBox

    txtResult

    用於顯示後台程序執行的結果

    ProgressBar

    pgbValue

    用於顯示背景程序執行的結果

    Button

    btnRun

    用於執行背景程序

    Button

    btnCancel

    用於取消正在執行的背景程序


        6.2代碼(下面代碼作用是將文件轉成swf):
    using System.ComponentModel;
    using System.IO;

    namespace BackgroundWorkerDemo
    {
        
    public partial class Form1 : Form
        {
            
    public Form1()
            {
                InitializeComponent();

                
    //“執行背景程序”按鈕事件
                btnRun.Click += new EventHandler(btnRun_Click);
                
    //“取消背景程序”按鈕事件
                btnCancel.Click += new EventHandler(btnCancel_Click);

                
    //是否允許BackgroundWorker 能否报告进度
                bgwWorker.WorkerReportsProgress = true;

                
    //選擇文件按鈕方法
                btnSelectFile.Click += new EventHandler(btnSelectFile_Click);


                
    //5.2
                //开始执行后台操作時
                
    //当执行BackgroundWorker.RunWorkerAsync方法时会触发该事件,并且传递DoWorkEventArgs参数;
                bgwWorker.DoWork += new DoWorkEventHandler(bgwWorker_DoWork);
                
    //引发 ProgressChanged 事件。 ProgressChanged是负责报告当前程序进度
                bgwWorker.ProgressChanged += new ProgressChangedEventHandler(bgwWorker_ProgressChanged);
                
    //当后台操作已完成、被取消或引发异常时发生。
                bgwWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgwWorker_RunWorkerCompleted);
                      
            }

            
    /// <summary>
            
    /// 被選擇的文件
            
    /// </summary>
            string sFile = "";

            
    /// <summary>
            
    /// ProgressBar的值
            
    /// </summary>
            int iProgressValue = 1;


            String fs_filename 
    = "";
            
    /// <summary>
            
    /// 得到轉換后文件在服務器的絕對路徑
            
    /// </summary>
            String fs_convertedfilename = "";

            
    /// <summary>
            
    /// 得到選項選擇的結果(0為瀏覽)
            
    /// </summary>
            int interfaceOptions = 0;

            
    /// <summary>
            
    /// 選擇文件
            
    /// </summary>
            
    /// <param name="sender"></param>
            
    /// <param name="e"></param>
            void btnSelectFile_Click(object sender, EventArgs e)
            {
                
    //選擇文件
                OpenFileDialog ofdDialog = new OpenFileDialog();  
                
    if (ofdDialog.ShowDialog()==DialogResult.OK)
                {
                    sFile 
    = ofdDialog.FileName;           
                    
    string sFilePathName = Path.GetDirectoryName(sFile) +"\\"+ Path.GetFileNameWithoutExtension(sFile);
                    txtSelect.Text 
    = sFile;

                    fs_filename 
    = sFile;
                    
                    
    //得到轉換后的文件名
                    fs_convertedfilename = sFilePathName + ".swf";
                }
            }

            
    /// <summary>
            
    /// “執行背景程序”按鈕事件的方法
            
    /// </summary>
            
    /// <param name="sender"></param>
            
    /// <param name="e"></param>
            void btnRun_Click(object sender, EventArgs e)
            {
                
    string sFile = "";
                
    //开始执行任务,會触发DoWork事件
                bgwWorker.RunWorkerAsync(sFile);
            }


            
    /// <summary>
            
    /// “取消背景程序”按鈕事件的方法
            
    /// </summary>
            
    /// <param name="sender"></param>
            
    /// <param name="e"></param>
            void btnCancel_Click(object sender, EventArgs e)
            {
                
    if (bgwWorker.IsBusy)
                {
                    
    //取消操作
                    bgwWorker.CancelAsync();
                    txtResult.Text 
    += "已取消";
                }
            }

     

            
    /// <summary>
            
    /// 开始执行后台操作時
            
    /// </summary>
            
    /// <param name="sender"></param>
            
    /// <param name="e"></param>
            void bgwWorker_DoWork(object sender, DoWorkEventArgs e)
            {
                BackgroundWorker bgwValue 
    = (BackgroundWorker)sender;

                
    //報告進度(進度值需自己傳入)
                bgwWorker.ReportProgress(iProgressValue);

                
    //5.3
                 //運行需要運行的方法。

                 RunPrint2Falsh();
                
    if ( RunPrint2Falsh()==true)
                {
                    bgwWorker.ReportProgress(
    100);
                }
            }

      
            
    /// <summary>
            
    /// 背景程序进度方法
            
    /// </summary>
            
    /// <param name="sender"></param>
            
    /// <param name="e"></param>
            void bgwWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                
    //5.4
                //
    設置ProgressBar設
                pgbValue.Value = e.ProgressPercentage;
      
            }

            
    /// <summary>
            
    /// 背景程序運行完成事件方法
            
    /// </summary>
            
    /// <param name="sender"></param>
            
    /// <param name="e"></param>
            void bgwWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                //5.5
                txtResult.Text 
    += "完成!";            
            }

            
    /// <summary>
            
    /// 運行將文件轉換成Flash程序(此處引用了Print2Flash控件)
            
    /// </summary>
            
    /// <returns></returns>
            private bool RunPrint2Falsh()
            {
                
    bool sRetrun = false;
                
    try
                {
                    P2F.Server2 p2fServer 
    = new P2F.Server2();
                    p2fServer.DefaultProfile.InterfaceOptions 
    = interfaceOptions;
                    p2fServer.ConvertFile(fs_filename, fs_convertedfilename, 
    nullnullnull);
                    sRetrun 
    = true;
                }
                
    catch (Exception ex)
                {                
                    
    throw ex;
                }
                
    return sRetrun;
            }
        }
    }
  • 相关阅读:
    n!末尾有几个零
    NYOJ 14(会场安排)
    使用dynamic来简化反射实现,并且提高了性能。
    VB.NET 、Java 与 C# 语法对比。
    你不得不使用的XML代码生成器,那就是XmlFactory
    C# 和vb.net事件
    SQL Server 2008中的hierarchyid
    系统架构师基础到企业应用架构客户端/服务器
    Asp.Net在IIS上运行不了,就试下下面方法应该可以你的问题
    为你的博客添加几分色彩
  • 原文地址:https://www.cnblogs.com/scottckt/p/1188974.html
Copyright © 2011-2022 走看看