zoukankan      html  css  js  c++  java
  • BackgroundWorker的替代者! (转)

    转自: http://blog.csdn.net/oldhunter/archive/2006/04/24/674310.aspx
    用过2.0中BackgroundWorker的网友估计都有遭遇不爽的经历,网上有文章说已经被定为BUG了.无BUG版本估计要等.NET的下一个build了.
    前两天写了个BackgroundWorker的替代者,我在自己的软件中已经用上了,目前没有发现问题.
    用法与BackgroundWorker一样,除了一个InvokerControl属性. 此属性主要用在更新FORM时,把状态更新方法的执行由线程池转到调用线程中.估计用过多线程的都知道,这里就不多说了.
    其它用法请参阅MDSN的BackgroundWorker类,里面的属性,方法及事件等与BackgroundWorker一模一样,所以可以用作过度替代,等.NET的build出来了再换过来!

    using System;
    using System.Threading;
    using System.ComponentModel;
    using System.Windows.Forms;

    namespace bget
    {
        class BackgroundWorker2 : Component
        {
            #region properties

            private Control invokerControl;

            public Control InvokerControl
            {
                get { return invokerControl; }
                set { invokerControl = value; }
            } 

            private bool cancellationPending;

            public bool CancellationPending
            {
                get { return cancellationPending; }
            }

            private bool isBusy;

            public bool IsBusy
            {
                get { return isBusy; }
            }


            private bool workerReportsProgress;

            public bool WorkerReportsProgress
            {
                get { return workerReportsProgress; }
                set { workerReportsProgress = value; }
            }

            private bool workerSupportsCancellation;

            public bool WorkerSupportsCancellation
            {
                get { return workerSupportsCancellation; }
                set { workerSupportsCancellation = value; }
            }

            #endregion

            public void RunWorkerAsync()
            {
                RunWorkerAsync(null);
            }

            public void RunWorkerAsync(Object argument)
            {
                if (IsBusy)
                {
                    throw new InvalidOperationException("Worker is busy now.");
                }

                OnDoWork(new DoWorkEventArgs(argument));
            }

            public void ReportProgress(int percentProgress)
            {
                ReportProgress(percentProgress, null);
            }

            public void ReportProgress(int percentProgress, Object userState)
            {
                if ( !workerReportsProgress )
                {
                    throw new InvalidOperationException("WorkerReportsProgress is required to be true.");
                }

                OnProgressChanged(new ProgressChangedEventArgs(percentProgress, userState));
            }

            public void CancelAsync()
            {
                if ( !workerSupportsCancellation )
                {
                    throw new InvalidOperationException("WorkerSupportsCancellation is required to be true.");
                }

                cancellationPending = true;
            }

            #region events

            public event DoWorkEventHandler DoWork;

            protected virtual void OnDoWork(DoWorkEventArgs e)
            {
                if (DoWork != null)
                {
                    isBusy = true;

                    try
                    {
                        DoWork.BeginInvoke(this, e, new AsyncCallback(DoWorkCallback), e); // 这里使用的是线程池
                    }
                    catch (Exception ex)
                    {
                        OnRunWorkerCompleted(new RunWorkerCompletedEventArgs(null, ex, false));
                        isBusy = false;
                        cancellationPending = false;
                    }
                }
            }

            private void DoWorkCallback(IAsyncResult ar)
            {
                if (ar.IsCompleted)
                {
                    DoWorkEventArgs args = ar.AsyncState as DoWorkEventArgs;
                    if (args != null)
                    {
                        OnRunWorkerCompleted(new RunWorkerCompletedEventArgs(args.Result, null, args.Cancel));
                    }

                    isBusy = false;
                    cancellationPending = false;
                }
            }

            public event ProgressChangedEventHandler ProgressChanged;

            protected virtual void OnProgressChanged(ProgressChangedEventArgs e)
            {
                if (ProgressChanged != null)
                {
                    if (invokerControl == null)
                    {
                        throw new InvalidOperationException("InvokerControl is required.");
                    }
                    if (invokerControl.InvokeRequired)
                    {
                        invokerControl.Invoke(ProgressChanged, this, e);
                    }
                    else
                    {
                        ProgressChanged(this, e);
                    }
                }
            }

            public event RunWorkerCompletedEventHandler RunWorkerCompleted;

            protected virtual void OnRunWorkerCompleted(RunWorkerCompletedEventArgs e)
            {
                if (RunWorkerCompleted != null)
                {
                    if (invokerControl == null)
                    {
                        throw new InvalidOperationException("InvokerControl is required.");
                    }
                    if (invokerControl.InvokeRequired)
                    {
                        invokerControl.Invoke(RunWorkerCompleted, this, e);
                    }
                    else
                    {
                        RunWorkerCompleted(this, e);
                    }
                }
            }

            #endregion       
        }
    }

    这是在"CSDN - 技术社区 - .NET技术 C# " 的贴子:
    http://community.csdn.net/Expert/topic/4707/4707944.xml?temp=1.667422E-02



  • 相关阅读:
    ThinkPHP中pathinfo模式与URL重写
    JS分割字符串并放入数组的函数
    js解决弹窗问题实现班级跳转DIV示例
    javascript客户端遍历控件与获取父容器对象
    Apache 虚拟目录和默认首页的设置
    linux Apache CGI 安装配置
    apache与和mysql重启命令
    带你从零学ReactNative开发跨平台App开发(三)
    带你从零学ReactNative开发跨平台App开发(一)
    C#/Net定时导出Excel并定时发送到邮箱
  • 原文地址:https://www.cnblogs.com/zxsoft/p/918812.html
Copyright © 2011-2022 走看看