本篇博客涉及定时器,委托中多线程的使用,希望对大家有所帮助~~~

WPF中定时器使用的注意事项:

WPF需要使用System.Windows.Threading.DispatcherTimer定时器,而不能使用System.Timers.Timer定时器。因为System.Timers.Timer运行在非UI线程,如果不使用SynchronizingObject属性,则该定时器启动的 子线程与窗体不在一个线程,不能访问WPF窗体中的控件(运行时会报该对象已被其他线程占用的异常),只能通过dialing的方式来访问,而System.Windows.Threading.DispatcherTimer运行在UI线程中,可以访问WPF窗体中的控件。或者,在System.Timers.Timer定时器中使用this.Dispatcher切换到UI线程后使用Invoke或者BeginInvoke方法更新UI画面。

1.创建System.Timers.Timer定时器并初始化:

System.Timers.Timer timer; 
private delegate SetProgress();//声明委托用于更新UI
public double value = 0; //进度条进度值
private delegate void AutoMJBuInfoMethod(string model, string pattern, Int32 orgid); //点击按钮使用委托 public MainWindow() {
InitializeComponent();
this.MJpbBar.Maximum = 100;
this.MJpbBar.Minimum = 0;
   if (timer == null) 
{
timer = new System.Timers.Timer();
timer.Interval = ;
timer.Elapsed += new ElapsedEventHandler(OnTick);;
}
}
private void OnTick(object sender, System.Timers.ElapsedEventArgs e)
{
timer.AutoReset = false; //是否只触发一次Elapsed法,false(次),true(重复)
timer.Enabled = false;//是否引发Elapsed事件
timer.stop();
ProgressBarAction(); //更新进度条方法
timer.AutoReset = true;
timer.Enabled= true;
timer.Start();
}

2.定时器执行方法(使用Invoke更新UI画面):

 private bool ProgressBarAction()
{
 this.Dispatcher.Invoke(DispatcherPriority.Normal, new SetProcess(updateUI)); MJpbBar.Dispatcher.Invoke(new Action<System.Windows.DependencyProperty, object>(MJpbBar.SetValue),
System.Windows.Threading.DispatcherPriority.Background, ProgressBar.ValueProperty, value);
}

3.更新UI方法:

private void UpdateUI()
{
value = (double)AUTOBUMJBusiness.FinishedMJCount * 100 / AUTOBUMJBusiness.TotalMJCount; //TotalMJCount为总计数量,FinishedMJCount为已完成数量 lblMJProcess.Content = "资料总条数:" + AUTOBUMJBusiness.TotalMJCount + ",已生成:" + AUTOBUMJBusiness.FinishedMJCount;

//执行结束后隐藏进度条
   if (AUTOBUMJBusiness.TotalMJCount == AUTOBUMJBusiness.FinishedMJCount && AUTOBUMJBusiness.TotalMJCount > 0)
   {
      this.lblMJProcess.Visibility = Visibility.Hidden;
      this.MJpbBar.Visibility = Visibility.Hidden;
      this.btnMJ.Visibility = Visibility.Visible;
   }

}

4.点击事件(点击按钮后执行另一个方法会堵塞线程,直到另一个线程执行结束,此时页面UI不会更新,所以此处使用委托开启另一条线程来执行这个方法):

private void btn_click(object sender, RoutedEventArgs e)
{    try
{

       this.lblMJProcess.Visibility = Visibility.Visible;
       this.MJpbBar.Visibility = Visibility.Visible;
       this.btnMJ.Visibility = Visibility.Hidden;

     AUTOBUMJBusiness oAUTOBUMJBusiness = new AUTOBUMJBusiness();
AutoMJBuInfoMethod oAuotoMJBuInfo = new AutoMJBuInfoMethod(oAUTOBUMJBusiness.DoAction);
oAuotoMJBuInfo.BeginInvoke(this.txtModel.Text.ToString().ToUpper().Trim(), this.txtPattern.Text.ToString().ToUpper().Trim(), Convert.ToInt32(this.txtOrgid.Text.ToString().Trim()), null, null);

}
    catch (Exception ex)
    {
       _log.Info("转MainWindow程序出错" + ":" + ex.Message + "." + DateTime.Now);
    }

}

在用户点击按钮后,主线程会被堵塞,直到点击事件中的DoAction全部执行完,才会执行下面的程序。因此会引发页面UI无法更新的问题,需要使用BeginInvoke方法来另开一条线程,用来执行DoAction方法,不会影响主线程的工作,从而不影响页面UI更新。

WPF中定时器与进度条的配合使用的更多相关文章

  1. WPF实现斜纹圆角进度条样式

    原文:WPF实现斜纹圆角进度条样式 运行效果: 进度条样式: <!--进度条样式--> <LinearGradientBrush x:Key="ProgressBar.Pr ...

  2. android中SeekBar拖动进度条的使用及事件监听

    下面和大家分享一下android中SeekBar拖动进度条的使用,以及事件监听.拖动进度条的事件监听需要实现SeekBar.OnSeekBarChangeListener接口,调用SeekBar的se ...

  3. (数据科学学习手札91)在Python中妥善使用进度条

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在日常运行程序的过程中常常涉及到循环迭代过程,对 ...

  4. WPF 自定义绕圈进度条

    在设计界面时,有时会遇到进度条,本次讲解如何设计自定义的绕圈进度条,直接上代码: 1.控件界面 <UserControl x:Class="ProgressBarControl&quo ...

  5. Unity3D中灵活绘制进度条

    有时我们需要在Unity3D中绘制进度条,如:           或        如果使用4.6版本以下的unity绘制环形的进度条可能需要费点劲.我搜到的大多数方法都是用NGUI插件,但有时只是 ...

  6. 用Raphael在网页中画圆环进度条

    原文 :http://boytnt.blog.51cto.com/966121/1074215 条状的进度条我们见得太多了,实现起来比较简单,它总是长方形的,在方形的区域里摆 放就不太好看了.随着cs ...

  7. JQuery中简约的进度条插件推荐

    JQuery Progress Bar是基于JQuery开发的进度条插件,秉承了JQuery的简约哲学.不仅容易使用,而且可以轻松定制外观.对于使用了JQuery框架的项目来说,需要使用进度条控件时这 ...

  8. 关于各种Vue UI框架中加载进度条的正确使用

    这里拿MUSE UI 中的进度条举例 <mu-circular-progress :size="40" class="icon" v-if="i ...

  9. WPF 自定义绕圈进度条(转)

    在设计界面时,有时会遇到进度条,本次讲解如何设计自定义的绕圈进度条,直接上代码: 1.控件界面 <UserControl x:Class="ProgressBarControl&quo ...

随机推荐

  1. 最简单的 react-router4 的安装和使用

    React-Router 的安装  npm install react-router React-Router提供了两个组件:Router和Route.下面看最简单的例子: src/Routes.js ...

  2. 1.字符串操作:& 2.英文词频统计预处理

    1.字符串操作: 解析身份证号:生日.性别.出生地等. ID = input('请输入十八位身份证号码: ') if len(ID) == 18: print("你的身份证号码是 " ...

  3. op 和 oo 的区别

    本是之前一位前辈留下的问题,因为我不是程序出身,略懂一些代码,后又查了很多人的博客,问了周围搞开发的朋友,得出以下结论: 有人这么形容OP和OO的不同:用面向过程的方法写出来的程序是一份蛋炒饭,而用面 ...

  4. MyPython

    目录 Python,那些不可不知的事儿 Python简介 Python环境搭建 从Hello World开始 Python中的数据类型 函数 模块 面向对象 More Python,那些不可不知的事儿 ...

  5. 使用 Nginx 内置 $http_user_agent 来区分( 电脑 pc、手机 mobile、平板 pad )端的内容访问

    location / { #pc端内容访问 set $flag "pc"; set $num 1; set $hua "${http_user_agent}"; ...

  6. MapReduce编程模型简介和总结

    MapReduce应用广泛的原因之一就是其易用性,提供了一个高度抽象化而变得非常简单的编程模型,它是在总结大量应用的共同特点的基础上抽象出来的分布式计算框架,在其编程模型中,任务可以被分解成相互独立的 ...

  7. Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析

    Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析 今天发一篇”水文”,可能很多读者都会表示不理解,不过我想把它作为并发序列文章中不可缺少的一块来介绍.本来以为花不了 ...

  8. 自制操作系统Antz(9)——实现内核 (下) 实现图形化界面

    Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址:https://www.cnblogs. ...

  9. PL/SQL变量和类型

    变量 在定义变量时一定要为其指定一个类型,类型可以是PL/SQL类型或SQL语言的类型,一旦变量的类型确定,那么变量中所能存储的值也就确定了,因此尽管变量的值会经常改变,但是值的类型是不可以变化的. ...

  10. 骨灰级玩家体验带你测试体验天使纪元OL折扣端

    刘亦菲代言吸引了我才进入游戏的(不知道有多少人和我一样)这个游戏没有一些骨灰级玩家带,真的很费时间费钱.   天使纪元5折折扣端(点击下载),其实是一个良心老平台,苹果,安卓.H5都支持的平台,采用最 ...