BackgroundWorker使用方法

这里先给出几个连接‘

https://stackoverflow.com/questions/1862590/how-to-update-gui-with-backgroundworker

http://www.dotnetframework.org/default.aspx/DotNET/DotNET/[email protected]/untmp/whidbey/REDBITS/ndp/fx/src/CompMod/System/ComponentModel/[email protected]/1/[email protected]

https://www.codeproject.com/Articles/42103/Generic-Background-Worker

https://msdn.microsoft.com/ja-jp/library/system.componentmodel.backgroundworker(v=vs.110).aspx

原代码:

namespace System.ComponentModel

{

    using System.ComponentModel.Design.Serialization;

    using System.Diagnostics;

    using System.Security.Permissions;

    using System.Threading;

 

    [

        SRDescription(SR.BackgroundWorker_Desc),

        DefaultEvent("DoWork"),

        HostProtection(SharedState = true)

    ]

    public class BackgroundWorker : Component

    {

        // Private statics

        private static readonly object doWorkKey = new object();

        private static readonly object runWorkerCompletedKey = new object();

        private static readonly object progressChangedKey = new object();

 

        // Private instance members

        private bool                                canCancelWorker = false;

        private bool                                workerReportsProgress = false;

        private bool                                cancellationPending = false;

        private bool                                isRunning = false;

        private AsyncOperation                      asyncOperation = null;

        private readonly WorkerThreadStartDelegate  threadStart;

        private readonly SendOrPostCallback operationCompleted;

        private readonly SendOrPostCallback progressReporter;

        public BackgroundWorker()

        {

            threadStart        = new WorkerThreadStartDelegate(WorkerThreadStart);

            operationCompleted = new SendOrPostCallback(AsyncOperationCompleted);

            progressReporter   = new SendOrPostCallback(ProgressReporter);

        }

 

        private void AsyncOperationCompleted(object arg)

        {

            isRunning = false;

            cancellationPending = false;

            OnRunWorkerCompleted((RunWorkerCompletedEventArgs)arg);

        }

 

        [

          Browsable(false),

          SRDescription(SR.BackgroundWorker_CancellationPending)

        ]

        public bool CancellationPending

        {

            get { return cancellationPending; }

        }

 

        public void CancelAsync()

        {

            if (!WorkerSupportsCancellation)

            {

                throw new InvalidOperationException(SR.GetString(SR.BackgroundWorker_WorkerDoesntSupportCancellation));

            }

            cancellationPending = true;

        }

        [

          SRCategory(SR.PropertyCategoryAsynchronous),

          SRDescription(SR.BackgroundWorker_DoWork)

        ]

        public event DoWorkEventHandler DoWork

        {

            add

            {

                this.Events.AddHandler(doWorkKey, value);

            }

            remove

            {

                this.Events.RemoveHandler(doWorkKey, value);

            }

        }

        /// <include file="doc\BackgroundWorker.uex" path="docs/doc[@for="BackgroundWorker.IsBusy"]/*">

        [

          Browsable(false),

          SRDescription(SR.BackgroundWorker_IsBusy)

        ]

        public bool IsBusy

        {

            get

            {

                return isRunning;

            }

        }

 

        /// <include file="doc\BackgroundWorker.uex" path="docs/doc[@for="BackgroundWorker.OnDoWork"]/*">

        protected virtual void OnDoWork(DoWorkEventArgs e)

        {

            DoWorkEventHandler handler = (DoWorkEventHandler)(Events[doWorkKey]);

            if (handler != null)

            {

                handler(this, e);

            }

        }

        /// <include file="doc\BackgroundWorker.uex" path="docs/doc[@for="BackgroundWorker.OnRunWorkerCompleted"]/*">

        protected virtual void OnRunWorkerCompleted(RunWorkerCompletedEventArgs e)

        {

            RunWorkerCompletedEventHandler handler = (RunWorkerCompletedEventHandler)(Events[runWorkerCompletedKey]);

            if (handler != null)

            {

                handler(this, e);

            }

        }

 

        protected virtual void OnProgressChanged(ProgressChangedEventArgs e)

        {

            ProgressChangedEventHandler handler = (ProgressChangedEventHandler)(Events[progressChangedKey]);

            if (handler != null)

            {

                handler(this, e);

            }

        }

 

        [

          SRCategory(SR.PropertyCategoryAsynchronous),

          SRDescription(SR.BackgroundWorker_ProgressChanged)

        ]

        public event ProgressChangedEventHandler ProgressChanged

        {

            add

            {

                this.Events.AddHandler(progressChangedKey, value);

            }

            remove

            {

                this.Events.RemoveHandler(progressChangedKey, value);

            }

        }

 

        // Gets invoked through the AsyncOperation on the proper thread.

        private void ProgressReporter(object arg)

        {

            OnProgressChanged((ProgressChangedEventArgs)arg);

        }

 

        // Cause progress update to be posted through current AsyncOperation.

        public void ReportProgress(int percentProgress)

        {

            ReportProgress(percentProgress, null);

        }

        // Cause progress update to be posted through current AsyncOperation.

        public void ReportProgress(int percentProgress, object userState)

        {

            if (!WorkerReportsProgress)

            {

                throw new InvalidOperationException(SR.GetString(SR.BackgroundWorker_WorkerDoesntReportProgress));

            }

 

            ProgressChangedEventArgs args = new ProgressChangedEventArgs(percentProgress, userState);

            if (asyncOperation != null)

            {

                asyncOperation.Post(progressReporter, args);

            }

            else

            {

                progressReporter(args);

            }

        }

        public void RunWorkerAsync()

        {

            RunWorkerAsync(null);

        }

        public void RunWorkerAsync(object argument)

        {

            if (isRunning)

            {

                throw new InvalidOperationException(SR.GetString(SR.BackgroundWorker_WorkerAlreadyRunning));

            }

 

            isRunning = true;

            cancellationPending = false;

 

            asyncOperation = AsyncOperationManager.CreateOperation(null);

            threadStart.BeginInvoke(argument,

                                    null,

                                    null);

        }

 

        [

          SRCategory(SR.PropertyCategoryAsynchronous),

          SRDescription(SR.BackgroundWorker_RunWorkerCompleted)

        ]

        public event RunWorkerCompletedEventHandler RunWorkerCompleted

        {

            add

            {

                this.Events.AddHandler(runWorkerCompletedKey, value);

            }

            remove

            {

                this.Events.RemoveHandler(runWorkerCompletedKey, value);

            }

        }

 

        [ SRCategory(SR.PropertyCategoryAsynchronous),

          SRDescription(SR.BackgroundWorker_WorkerReportsProgress),

          DefaultValue(false)

        ]

        public bool WorkerReportsProgress

        {

            get { return workerReportsProgress; }

            set { workerReportsProgress = value; }

        }

        [

          SRCategory(SR.PropertyCategoryAsynchronous),

          SRDescription(SR.BackgroundWorker_WorkerSupportsCancellation),

          DefaultValue(false)

        ]

        public bool WorkerSupportsCancellation

        {

            get { return canCancelWorker; }

            set { canCancelWorker = value; }

        }

 

        private delegate void WorkerThreadStartDelegate(object argument);

 

        private void WorkerThreadStart(object argument)

        {

            object workerResult = null;

            Exception error = null;

            bool cancelled = false;

 

            try

            {

                DoWorkEventArgs doWorkArgs = new DoWorkEventArgs(argument);

                OnDoWork(doWorkArgs);

                if (doWorkArgs.Cancel)

                {

                    cancelled = true;

                }

                else

                {

                    workerResult = doWorkArgs.Result;

                }

            }

            catch (Exception exception)

            {

                error = exception;

            }

 

            RunWorkerCompletedEventArgs e =

                new RunWorkerCompletedEventArgs(workerResult, error, cancelled);

 

            asyncOperation.PostOperationCompleted(operationCompleted, e);

        }

    }

}

时间: 2024-08-28 03:32:40

BackgroundWorker使用方法的相关文章

C# backgroundworker使用方法

# BackgroundWorker 控件的几个实例(C# backgroundworker使用方法): 在 WinForms 中,有时要执行耗时的操作,在该操作未完成之前操作用户界面,会导致用户界面停止响应.解决的方法就是新开一个线程,把耗时的操作放到线程中执行,这样就可以在用户界面上进行其它操作.新建线程可以用 Thread 类,可以实现多线程同时操作,简单的可以通过 BackgroundWorker 类实现. 用 BackgroundWorker 类执行耗时的操作BackgroundWor

【C#】【Thread】BackgroundWorker的使用

BackgroundWorker 可以用于启动后台线程. 主要的事件及参数: 1.DoWork --当执行BackgroundWorker.RunWorkerAsync方法时会触发该事件,并且传递DoWorkEventArgs参数; 2.RunWorkerCompleted --异步操作完成或中途终止会触发该事件. 如果需要提前终止执行后台操作,可以调用BackgroundWorker.CancelAsync方法. 在处理DoWork事件的函数中检测BackgroundWorker.Cancel

C# BackgroundWorker的使用

文章摘自:http://www.cnblogs.com/tom-tong/archive/2012/02/22/2363965.html BackgroundWorker 可以用于启动后台线程. 主要的事件及参数: 1.DoWork——当执行BackgroundWorker.RunWorkerAsync方法时会触发该事件,并且传递DoWorkEventArgs参数; 2.RunWorkerCompleted——异步操作完成或中途终止会触发该事件. 如果需要提前终止执行后台操作,可以调用Backg

C# BackgroundWorker的使用 转

转自http://www.cnblogs.com/tom-tong/archive/2012/02/22/2363965.html  感谢作者详细的介绍 C# BackgroundWorker的使用 BackgroundWorker 可以用于启动后台线程. 主要的事件及参数: 1.DoWork——当执行BackgroundWorker.RunWorkerAsync方法时会触发该事件,并且传递DoWorkEventArgs参数; 2.RunWorkerCompleted——异步操作完成或中途终止会

C# BackgroundWorker使用总结

查询了一下MSDN文档,其中微软就BackgroundWorker类的功能有这么一个描述(英文的,根据个人理解翻译):BackgroundWorker类允许您在单独的线程上执行某个可能导致用户界面(UI)停止响应的耗时操作(比如文件下载数据库事务等),并且想要一个响应式的UI来反应当前耗时操作的进度. 可以看的出来,BackgroundWorker组件提供了一种执行异步操作(后台线程)的同时,并且还能妥妥的显示操作进度的解决方案.于是乎,我便深入的了解了一下BackgroundWorker类.针

WPF 线程 Dispatcher

WPF 应用程序从两个线程开始: 一个用于处理呈现 一个用于管理 UI 呈现线程有效地隐藏在后台运行,而UI线程则接收输入.处理事件.绘制屏幕以及运行应用程序代码. 大多数应用程序都使用一个 UI 线程,但在某些情况下,最好使用多个线程.我们将在后面举例说明这一点. UI 线程对一个名为 Dispatcher 的对象内的工作项进行排队. Dispatcher基于优先级选择工作项,并运行每一个工作项,直到完成.每个UI线程都必须至少有一个Dispatcher,并且每个 Dispatcher 都只能

winform跨线程问题

1.invoke是同步线程 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading; 9 using System.Threading.Tasks; 10 using

多线程的应用小结

一.使用多线程的几种方式 不需要传递参数,也不需要返回参数 ThreadStart是一个委托,这个委托的定义为void ThreadStart(),没有参数与返回值. class Program { static void Main(string[] args) { for (int i = 0; i < 30; i++) { ThreadStart threadStart = new ThreadStart(Calculate); Thread thread = new Thread(thre

做进度条 根据自己的数据显示进度

做了很多种方法 1: 线程 thread的方法 2: backGroundWorker的方法 3: 自定义线程类 4: 做一个进度条的窗体  通过自定义设置做(最方便快捷) public partial class waitingProcessbar : Form { public waitingProcessbar() { InitializeComponent(); } /// <summary> /// 设定百分比 /// </summary> private int per