WPF线程——BackgroundWorker

在WPF中第二个常用的线程处理方式就是BackgroundWorker。

以下是BackgroundWorker一个简单的例子。

public partial class MainWindow : Window
    {
        /// <summary>
        /// 后台worker
        /// </summary>
        BackgroundWorker worker = new BackgroundWorker();

        public MainWindow()
        {
            InitializeComponent();
            worker.WorkerReportsProgress = true;
            worker.DoWork += new DoWorkEventHandler(worker_DoWork);
            worker.ProgressChanged += worker_ProgressChanged;
            this.btn_test.Click += btn_test_Click;
        }

        /// <summary>
        /// 按钮点击
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void btn_test_Click(object sender, RoutedEventArgs e)
        {
            worker.RunWorkerAsync();
        }

        /// <summary>
        /// 进度返回处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.pb_test.Value = e.ProgressPercentage;
        }

        /// <summary>
        /// 业务逻辑处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 0; i <= 100; i++)
            {
                worker.ReportProgress(i);//返回进度
                Thread.Sleep(100);
            }
        }
    }

其中要注意的有BackgroundWorker的属性WorkerReportsProgress表示BackgroundWorker是否可以返回进度。事件DoWork中处理自身的业务逻辑,ProgressChanged负责更新界面操作。

 



项目托管地址:https://wpfthread.codeplex.com/

时间: 2024-10-07 07:40:32

WPF线程——BackgroundWorker的相关文章

使用后台线程BackgroundWorker处理任务的总结

在一些耗时的操作过程中,在长时间运行时可能会导致用户界面 (UI) 处于停止响应状态,用户在这操作期间无法进行其他的操作,为了不使UI层处于停止响应状态,我们倾向推荐用户使用BackgroundWorker来进行处理,这个后台的线程处理,可以很好的实现常规操作的同时,还可以及时通知UI,包括当前处理信息和进度等,这个BackgroundWorker的处理在百度里面也是有很多使用的介绍,本篇随笔主要是做一些自己的使用总结,希望也能给读者提供一个参考. 在使用BackgroundWorker的过程中

WPF 线程中异常导致程序崩溃

原文:WPF 线程中异常导致程序崩溃 一般我们WPF中都加全局捕获,避免出现异常导致崩溃. Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException; AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException)

WPF 线程 Dispatcher

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

WPF线程

WPF中的线程使用 简介 但凡涉及到图形界面,往往的设计都是不支持或者不推荐使用多个线程操作界面内容.而且通常会有一个专门的线程调度器来处理任务线程和界面线程的问题.下面提供两个两个方案. 使用Dispatcher.BeginInvoke 这个方法简单暴力适合小工作量的修改一些界面内容.使用Dispatcher.BeginInvoke()会将代码安排为调度程序的一个任务. 步骤 使用Thread新建并开始一个线程 在新建的线程处理函数中需要修改界面的时候获取界面的dispatcher 使用Dis

WPF线程&mdash;&mdash;Dispatcher

使用WPF开发时经常会遇上自己建立的线程需要更新界面UI内容,从而导致的跨线程问题. 异常内容: 异常类型:System.InvalidOperationException 异常描述: "System.InvalidOperationException"类型的未经处理的异常在 WindowsBase.dll 中发生 其他信息: 调用线程无法访问此对象,因为另一个线程拥有该对象. 在WPF中最简便的解决此问题的方法就是使用Dispatcher. 1.最便捷的使用Dispatcher th

wpf 线程

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

WPF线程问题

今天看书上写的一个例子, 1 private void AddMessage(string formatString, 2 params string[] parameters) 3 { 4 Dispatcher.BeginInvoke(new Action( 5 () => WatchOutput.Items.Insert( 6 0, string.Format(formatString, parameters)))); 7 } Dispatcher.BeginInvoke是啥玩意,为啥要这么

wpf 线程与界面线程

Thread thread = new Thread(new ThreadStart(() =>        {            VisualTarget visualTarget = new VisualTarget(hostVisual);            var control = new UserControl1();            control.Arrange(new Rect(new Point(), content.RenderSize));        

WPF 利用BackgroundWorker 动态加载UI

BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += (ee, se) => { //TODO 需要异步请求的操作 }; bw.RunWorkerCompleted += (ew, sw) => { Dispatcher.Invoke(new Action(() => { <span style="white-space:pre"> </span>//TODO 动态生成UI }))