博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF多线程演示
阅读量:5079 次
发布时间:2019-06-12

本文共 5300 字,大约阅读时间需要 17 分钟。

 

WPF中的几种处理线程的工作方式:

1.简单的DispatcherTimer类似Timer控件

2.需要处理UI同步时,Dispatcher DispatcherOpertion

3.增强的Thread对象  System.Windows.Threading

4.BackgroundWorker组建对象

下面看下展示着几种处理方式:xaml文件

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;//引入线程命名空间using System.Windows.Threading;namespace WPF多线程演示{    ///     /// MainWindow.xaml 的交互逻辑    ///     public partial class MainWindow : Window    {        public MainWindow()        {            InitializeComponent();        }        //方式一        DispatcherTimer tm = new DispatcherTimer();//实例化一个DispatcherTimer对象        private void button1_Click(object sender, RoutedEventArgs e)        {            tm.Tick += new EventHandler(tm_Tick);//订阅Tick事件            tm.Interval = TimeSpan.FromSeconds(0.05);            tm.Start();            // tm.Stop();        }        void tm_Tick(object sender, EventArgs e)        {            if (progressBar1.Value<=100)            {                progressBar1.Value++;                this.label2.Content = progressBar1.Value++ +"%";            }            else            {                tm.Stop();            }                  }        //方式二        public void newActionThread(int value)        {            this.progressBar1.Value = value;            this.label2.Content = progressBar1.Value++ + "%";            System.Threading.Thread.Sleep(100);        }              // 使用线程 方法        public void DispatcherThread()        {            Dispatcher newDispatcher = Dispatcher.CurrentDispatcher;//提供线程工作环境            Action
newAction = new Action
(this.newActionThread); for (int i = 0; i < 100; i++) { newDispatcher.Invoke(newAction, i); System.Threading.Thread.Sleep(100); this.DoEvents(); // newDispatcher.Thread.Abort(); } } private void button2_Click(object sender, RoutedEventArgs e) { DispatcherThread(); } //方式三 public void newActionThread2(object value) { Action
newAction = new Action
(this.newActionThread); this.progressBar1.Dispatcher.Invoke(newAction, (int)value);//同步执行指定的委托 System.Threading.Thread.Sleep(100); } public void Thread() { //winform中的线程 // System.Threading.Thread; //wpf环境中的线程 //System.Windows.Threading.Dispatcher.CurrentDispatcher.Thread System.Threading.ParameterizedThreadStart ts = new System.Threading.ParameterizedThreadStart(this.newActionThread2);//一个线程执行委托 for (int i = 0; i <= 100; i++) { System.Threading.Thread t = new System.Threading.Thread(ts); System.Threading.Thread.Sleep(100); t.Start(i); this.label2.Content = progressBar1.Value++ + "%"; this.DoEvents();//界面刷新 } } private void button3_Click(object sender, RoutedEventArgs e) { Thread(); } //方式四BackgroundWorker //http://msdn.microsoft.com/zh-cn/library/vstudio/system.componentmodel.backgroundworker.aspx更多信息 System.ComponentModel.BackgroundWorker bw; private void button4_Click(object sender, RoutedEventArgs e) { bw = new System.ComponentModel.BackgroundWorker();//创建BackgroundWorker对象实例 bw.DoWork += new System.ComponentModel.DoWorkEventHandler(bw_DoWork);//订阅DoWork事件 bw.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(bw_ProgressChanged);//订阅报告进程事件 bw.WorkerReportsProgress = true; bw.RunWorkerAsync();//开始执行后台操作 } void bw_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) { this.progressBar1.Value = e.ProgressPercentage;//获取进度百分比 this.label2.Content = (e.ProgressPercentage.ToString() + "%"); } void bw_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { for (int i = 0; i <= 100; i++) { this.bw.ReportProgress(i); System.Threading.Thread.Sleep(100); } } //方式5我们可以利用线程并行来处理 }}

类EX中的是一个扩展方法。进行界面刷新

public static class Ex    {        //扩展方法进行界面刷新        public static void DoEvents(this Window win)        {            DispatcherFrame frame = new DispatcherFrame();            Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,                new DispatcherOperationCallback(ExitFrames), frame);            Dispatcher.PushFrame(frame);        }        public static object ExitFrames(object f)        {            ((DispatcherFrame)f).Continue = false;            return null;        }    }

 

效果展示:

demo下载:

 

转载于:https://www.cnblogs.com/BABLOVE/p/3235971.html

你可能感兴趣的文章
SQL Server 使用作业设置定时任务之一(转载)
查看>>
第二阶段冲刺-01
查看>>
BZOJ1045 HAOI2008 糖果传递
查看>>
JavaScript 克隆数组
查看>>
eggs
查看>>
oracle 报错ORA-12514: TNS:listener does not currently know of service requested in connec
查看>>
python3 生成器与迭代器
查看>>
java编写提升性能的代码
查看>>
Abstract Factory Pattern
查看>>
list 容器 排序函数.xml
查看>>
《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇03:暂停游戏》
查看>>
CPU,寄存器,一缓二缓.... RAM ROM 外部存储器等简介
查看>>
windows下编译FreeSwitch
查看>>
git .gitignore 文件不起作用
查看>>
Alan Turing的纪录片观后感
查看>>
c#自定义控件中的事件处理
查看>>
django Models 常用的字段和参数
查看>>
IOS--沙盒机制
查看>>
使用 JointCode.Shuttle 访问任意 AppDomain 的服务
查看>>
sqlite的坑
查看>>