• 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



  • 相关阅读:
    执行上下文和作用域,作用域链
    学习笔记一:定位
    exports和module.exports的区别——学习笔记
    伪类和伪元素
    visibility和display
    CSS选择器,层叠
    Servlet乱码处理-------续集
    Servlet的乱码处理手记
    前端框架之Semantic UI
    最完整的Oracle11g 概述
  • 原文地址:https://www.cnblogs.com/xingbinggong/p/2095387.html
Copyright © 2020-2023  润新知