zoukankan      html  css  js  c++  java
  • BackgroundWorker 类

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

    若要在后台执行耗时的操作,请创建一个 BackgroundWorker,侦听那些报告操作进度并在操作完成时发出信号的事件。

    可以通过编程方式创建 BackgroundWorker

    // Set up the BackgroundWorker object by
    // attaching event handlers.
    privatevoid InitializeBackgoundWorker()
    {
    backgroundWorker1.DoWork
    +=
    new DoWorkEventHandler(backgroundWorker1_DoWork);
    backgroundWorker1.RunWorkerCompleted
    +=
    new RunWorkerCompletedEventHandler(
    backgroundWorker1_RunWorkerCompleted);
    backgroundWorker1.ProgressChanged
    +=
    new ProgressChangedEventHandler(
    backgroundWorker1_ProgressChanged);
    }

    ,也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。

    若要设置后台操作,请为 DoWork 事件添加一个事件处理程序。在此事件处理程序中调用耗时的操作。若要启动该操作,请调用 RunWorkerAsync。若要收到进度更新通知,请对 ProgressChanged 事件进行处理。若要在操作完成时收到通知,请对 RunWorkerCompleted 事件进行处理。

    您必须非常小心,确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChangedRunWorkerCompleted 事件与用户界面进行通信。

    具体参见MSDN:ms-help://MS.MSDNQTR.v90.chs/fxref_system/html/0d0bd685-a893-fa26-f9b6-0d4d7e2af8c6.htm

    -----------------------------------------------------示例-----------------------------------------------------------------------------------

    form中添加 backgroundworker控件,progressbar控件,开始按钮,停止按钮。

            private static int count1 = 10;

    /// <summary>
    /// 用于多个backagegroundworker共用的方法
    /// </summary>
    /// <param name="worker"></param>
    /// <param name="e"></param>
    /// <returns></returns>
    private int DoWork(BackgroundWorker worker, DoWorkEventArgs e)
    {
    //result即为在RunWorkerAsync中传入的参数count1
    int result = (int)e.Argument;
    for (int i = 0; i < result; i++)
    {
    if (worker.CancellationPending)
    {
    return i;
    }
    int percent = (int)((double)i / result*100);
    worker.ReportProgress(percent);
    Thread.Sleep(1000);
    }
    return result;
    }

    #region page1

    private void buttonStart1_Click(object sender, EventArgs e)
    {
    //count1作为参数传入DoWork事件中
    backgroundWorker1.RunWorkerAsync(count1);
    }

    private void buttonStop1_Click(object sender, EventArgs e)
    {
    backgroundWorker1.CancelAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
    BackgroundWorker worker = sender as BackgroundWorker;
    e.Result = DoWork(worker, e);
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
    //更新进度条进度
    progressBar1.Value = e.ProgressPercentage;
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    progressBar1.Value = 100;
    MessageBox.Show(string.Format("Total records: {0}", e.Result));
    }

    #endregion



  • 相关阅读:
    算法笔记:树、堆和图
    typora主题配置:公众号一键排版
    算法笔记:哈希表、映射和集合
    Linux Bash之getopt命令行参数解析
    linux上常用命令
    python的selenium如何下载pdf文件
    关于日语分词Japanese segmenter
    python 语种识别的几种方法
    anaconda的安装与使用
    如何去拆分句子
  • 原文地址:https://www.cnblogs.com/xingbinggong/p/2095387.html
Copyright © 2011-2022 走看看