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



  • 相关阅读:
    Verilog非阻塞赋值的仿真/综合问题 (Nonblocking Assignments in Verilog Synthesis)上
    异步FIFO结构及FPGA设计 跨时钟域设计
    FPGA管脚分配需要考虑的因素
    An Introduction to Delta Sigma Converters (DeltaSigma转换器 上篇)
    An Introduction to Delta Sigma Converters (DeltaSigma转换器 下篇)
    中国通信简史 (下)
    谈谈德国大学的电子专业
    中国通信简史 (上)
    Verilog学习笔记
    Verilog非阻塞赋值的仿真/综合问题(Nonblocking Assignments in Verilog Synthesis) 下
  • 原文地址:https://www.cnblogs.com/xingbinggong/p/2095387.html
Copyright © 2011-2022 走看看