介绍
重新想象 Windows 8 Store Apps 之 线程池

  • 通过 ThreadPoolTimer 实现延迟执行
  • 通过 ThreadPoolTimer 实现周期执行
  • 通过 ThreadPool 实现“在线程池中找一个线程去执行指定的方法”

示例
1、通过 ThreadPoolTimer 实现延迟执行(ThreadPoolTimer 在 Windows.System.Threading 命名空间下)
Thread/ThreadPool/DelayTimer.xaml

  1. <Page
  2. x:Class="XamlDemo.Thread.ThreadPool.DelayTimer"
  3. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  4. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  5. xmlns:local="using:XamlDemo.Thread.ThreadPool"
  6. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  7. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  8. mc:Ignorable="d">
  9.  
  10. <Grid Background="Transparent">
  11. <StackPanel Margin="120 0 0 0">
  12.  
  13. <TextBlock Name="lblMsg" FontSize="14.667" />
  14.  
  15. <Button Name="btnCreateDelay" Content="延迟 3 秒后执行一个任务" Click="btnCreateDelay_Click_1" Margin="0 10 0 0" />
  16.  
  17. <Button Name="btnCancelDelay" Content="取消任务" Click="btnCancelDelay_Click_1" Margin="0 10 0 0" />
  18.  
  19. </StackPanel>
  20. </Grid>
  21. </Page>

Thread/ThreadPool/DelayTimer.xaml.cs

  1. /*
  2. * 通过 ThreadPoolTimer 实现延迟执行(ThreadPoolTimer 在 Windows.System.Threading 命名空间下)
  3. *
  4. * ThreadPoolTimer - 计时器
  5. * ThreadPoolTimer CreateTimer(TimerElapsedHandler handler, TimeSpan delay, TimerDestroyedHandler destroyed); - 创建一个用于延迟执行的计时器
  6. * handler - 指定的延迟时间过后,所需要执行的方法
  7. * delay - 延迟时间
  8. * destroyed - 当 ThreadPoolTimer 完成了自身的使命后所执行的方法(比如延迟方法执行完了或计时器被取消了)
  9. * Cancel() - 取消计时器
  10. * Delay - 延迟时间,只读
  11. */
  12.  
  13. using System;
  14. using Windows.UI.Xaml;
  15. using Windows.UI.Xaml.Controls;
  16. using Windows.System.Threading;
  17. using Windows.UI.Core;
  18.  
  19. namespace XamlDemo.Thread.ThreadPool
  20. {
  21. public sealed partial class DelayTimer : Page
  22. {
  23. private ThreadPoolTimer _timer;
  24.  
  25. public DelayTimer()
  26. {
  27. this.InitializeComponent();
  28. }
  29.  
  30. // 创建一个延迟计时器
  31. private void btnCreateDelay_Click_1(object sender, RoutedEventArgs e)
  32. {
  33. _timer = ThreadPoolTimer.CreateTimer(
  34. (timer) =>
  35. {
  36. var ignored = Dispatcher.RunAsync(CoreDispatcherPriority.High,
  37. () =>
  38. {
  39. lblMsg.Text = "任务执行了";
  40. });
  41. },
  42. TimeSpan.FromSeconds(3),
  43. (timer) =>
  44. {
  45. var ignored = Dispatcher.RunAsync(CoreDispatcherPriority.High,
  46. () =>
  47. {
  48. lblMsg.Text += Environment.NewLine;
  49. lblMsg.Text += "ThreadPoolTimer 的使命结束了";
  50. });
  51. });
  52.  
  53. lblMsg.Text = "延迟 3 秒后执行一个任务";
  54. }
  55.  
  56. // 取消计时器
  57. private void btnCancelDelay_Click_1(object sender, RoutedEventArgs e)
  58. {
  59. if (_timer != null)
  60. {
  61. _timer.Cancel();
  62. _timer = null;
  63.  
  64. lblMsg.Text += Environment.NewLine;
  65. lblMsg.Text += "任务取消了";
  66. }
  67. }
  68. }
  69. }

2、通过 ThreadPoolTimer 实现周期执行(ThreadPoolTimer 在 Windows.System.Threading 命名空间下)
Thread/ThreadPool/PeriodicTimer.xaml

  1. <Page
  2. x:Class="XamlDemo.Thread.ThreadPool.PeriodicTimer"
  3. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  4. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  5. xmlns:local="using:XamlDemo.Thread.ThreadPool"
  6. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  7. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  8. mc:Ignorable="d">
  9.  
  10. <Grid Background="Transparent">
  11. <StackPanel Margin="120 0 0 0">
  12.  
  13. <TextBlock Name="lblMsg" FontSize="14.667" />
  14.  
  15. <Button Name="btnCreatePeriodic" Content="执行一个周期任务" Click="btnCreatePeriodic_Click_1" Margin="0 10 0 0" />
  16.  
  17. <Button Name="btnCancelPeriodic" Content="取消任务" Click="btnCancelPeriodic_Click_1" Margin="0 10 0 0" />
  18.  
  19. </StackPanel>
  20. </Grid>
  21. </Page>

Thread/ThreadPool/PeriodicTimer.xaml.cs

  1. /*
  2. * 通过 ThreadPoolTimer 实现周期执行(ThreadPoolTimer 在 Windows.System.Threading 命名空间下)
  3. *
  4. * ThreadPoolTimer - 计时器
  5. * ThreadPoolTimer CreatePeriodicTimer(TimerElapsedHandler handler, TimeSpan period, TimerDestroyedHandler destroyed) - 创建一个用于延迟执行的计时器
  6. * handler - 每个周期时间点到达之后,所需要执行的方法
  7. * period - 周期执行的间隔时间
  8. * destroyed - 当 ThreadPoolTimer 完成了自身的使命后所执行的方法(比如计时器被取消了)
  9. * Cancel() - 取消计时器
  10. * Period - 间隔时间,只读
  11. */
  12.  
  13. using System;
  14. using Windows.System.Threading;
  15. using Windows.UI.Core;
  16. using Windows.UI.Xaml;
  17. using Windows.UI.Xaml.Controls;
  18.  
  19. namespace XamlDemo.Thread.ThreadPool
  20. {
  21. public sealed partial class PeriodicTimer : Page
  22. {
  23. private ThreadPoolTimer _timer;
  24. private int _periodicTimerCount = 0;
  25.  
  26. public PeriodicTimer()
  27. {
  28. this.InitializeComponent();
  29. }
  30.  
  31. // 创建一个周期计时器
  32. private void btnCreatePeriodic_Click_1(object sender, RoutedEventArgs e)
  33. {
  34. _timer = ThreadPoolTimer.CreatePeriodicTimer(
  35. (timer) =>
  36. {
  37. _periodicTimerCount++;
  38.  
  39. var ignored = Dispatcher.RunAsync(CoreDispatcherPriority.High,
  40. () =>
  41. {
  42. lblMsg.Text = "任务执行次数:" + _periodicTimerCount.ToString();
  43. });
  44. },
  45. // 第 1 次执行 handler 是在计时器被创建的 100 毫秒之后,然后每 100 毫秒执行一次 handler
  46. // 计时器会保证每 100 毫秒调用一次 handler,而不管上一次 handler 是否已执行完
  47. TimeSpan.FromMilliseconds(100),
  48. (timer) =>
  49. {
  50. var ignored = Dispatcher.RunAsync(CoreDispatcherPriority.High,
  51. () =>
  52. {
  53. lblMsg.Text += Environment.NewLine;
  54. lblMsg.Text += "ThreadPoolTimer 的使命结束了";
  55. });
  56. });
  57.  
  58. lblMsg.Text = "任务执行次数:0";
  59. }
  60.  
  61. // 取消计时器
  62. private void btnCancelPeriodic_Click_1(object sender, RoutedEventArgs e)
  63. {
  64. if (_timer != null)
  65. {
  66. _timer.Cancel();
  67. _timer = null;
  68. _periodicTimerCount = 0;
  69.  
  70. lblMsg.Text = "任务取消了";
  71. }
  72. }
  73. }
  74. }

3、通过 ThreadPool 实现“在线程池中找一个线程去执行指定的方法”(ThreadPool 在 Windows.System.Threading 命名空间下)
Thread/ThreadPool/WorkItem.xaml

  1. <Page
  2. x:Class="XamlDemo.Thread.ThreadPool.WorkItem"
  3. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  4. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  5. xmlns:local="using:XamlDemo.Thread.ThreadPool"
  6. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  7. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  8. mc:Ignorable="d">
  9.  
  10. <Grid Background="Transparent">
  11. <StackPanel Margin="120 0 0 0">
  12.  
  13. <TextBlock Name="lblMsg" FontSize="14.667" />
  14.  
  15. <TextBlock Name="lblProgress" FontSize="14.667" />
  16.  
  17. <Button Name="btnCreateWorkItem" Content="在线程池中找一个线程去执行指定的方法" Click="btnCreateWorkItem_Click_1" Margin="0 10 0 0" />
  18. <Button Name="btnCancelWorkItem" Content="取消任务" Click="btnCancelWorkItem_Click_1" Margin="0 10 0 0" />
  19.  
  20. <Button Name="btnCreateWorkItemByAwait" Content="通过 async await 简化“在线程池中找一个线程去执行指定的方法”" Click="btnCreateWorkItemByAwait_Click_1" Margin="0 30 0 0" />
  21.  
  22. </StackPanel>
  23. </Grid>
  24. </Page>

Thread/ThreadPool/WorkItem.xaml.cs

  1. /*
  2. * 通过 ThreadPool 实现“在线程池中找一个线程去执行指定的方法”(ThreadPool 在 Windows.System.Threading 命名空间下)
  3. *
  4. * ThreadPool - 线程池
  5. * IAsyncAction RunAsync(WorkItemHandler handler, WorkItemPriority priority) - 在线程池中找一个线程去执行指定的方法,并指定其优先级
  6. * handler - 需要调用的方法
  7. * priority - 优先级(Windows.UI.Core.CoreDispatcherPriority 枚举:Low, Normal, High)
  8. *
  9. *
  10. * 注:关于 IAsyncAction 请参见 XamlDemo/Thread/Async 中的说明
  11. */
  12.  
  13. using System;
  14. using System.Threading;
  15. using Windows.Foundation;
  16. using Windows.System.Threading;
  17. using Windows.UI.Core;
  18. using Windows.UI.Xaml;
  19. using Windows.UI.Xaml.Controls;
  20.  
  21. namespace XamlDemo.Thread.ThreadPool
  22. {
  23. public sealed partial class WorkItem : Page
  24. {
  25. private IAsyncAction _threadPoolWorkItem;
  26. private ManualResetEvent _sleep = new ManualResetEvent(false);
  27.  
  28. public WorkItem()
  29. {
  30. this.InitializeComponent();
  31. }
  32.  
  33. // 在线程池中找一个线程去执行指定的方法,并指定其优先级
  34. private void btnCreateWorkItem_Click_1(object sender, RoutedEventArgs e)
  35. {
  36. _threadPoolWorkItem = Windows.System.Threading.ThreadPool.RunAsync(
  37. (threadPoolWorkItem) =>
  38. {
  39. int percent = 0; // 用于模拟执行进度(0 - 100)
  40. while (percent < 100)
  41. {
  42. // 当前线程 sleep 100 毫秒
  43. _sleep.WaitOne(100);
  44.  
  45. // 如果 IAsyncAction 被取消了则退出此 handler 的执行
  46. if (threadPoolWorkItem.Status == AsyncStatus.Canceled)
  47. break;
  48.  
  49. percent++;
  50.  
  51. var ignored = Dispatcher.RunAsync(CoreDispatcherPriority.High,
  52. () =>
  53. {
  54. lblProgress.Text = "进度:" + percent.ToString() + "%";
  55. });
  56. }
  57. },
  58. WorkItemPriority.High);
  59.  
  60. // IAsyncAction 完成之后(比如任务完成了或者任务取消了)
  61. // 关于 IAsyncAction 的详细说明请参见 XamlDemo/Thread/Async
  62. _threadPoolWorkItem.Completed = new AsyncActionCompletedHandler(
  63. async (IAsyncAction threadPoolWorkItem, AsyncStatus status) =>
  64. {
  65. await Dispatcher.RunAsync(CoreDispatcherPriority.High,
  66. () =>
  67. {
  68. switch (status)
  69. {
  70. case AsyncStatus.Completed:
  71. lblMsg.Text = "任务完成了";
  72. break;
  73. case AsyncStatus.Canceled:
  74. lblMsg.Text = "任务取消了";
  75. break;
  76. case AsyncStatus.Started:
  77. case AsyncStatus.Error:
  78. break;
  79. }
  80. });
  81. });
  82.  
  83. lblProgress.Text = "进度:0%";
  84. lblMsg.Text = "任务开始了";
  85. }
  86.  
  87. // 取消任务
  88. private void btnCancelWorkItem_Click_1(object sender, RoutedEventArgs e)
  89. {
  90. if (_threadPoolWorkItem != null)
  91. {
  92. _threadPoolWorkItem.Cancel();
  93. _threadPoolWorkItem = null;
  94. }
  95. }
  96.  
  97. // 通过 async await 简化 ThreadPool.RunAsync() 的使用(关于 async 和 await 的详细说明请参见 XamlDemo/Thread/Async)
  98. private async void btnCreateWorkItemByAwait_Click_1(object sender, RoutedEventArgs e)
  99. {
  100. lblProgress.Text = "";
  101. lblMsg.Text = "";
  102.  
  103. string result = "";
  104.  
  105. await Windows.System.Threading.ThreadPool.RunAsync(
  106. delegate
  107. {
  108. new ManualResetEvent(false).WaitOne(3000);
  109. result = "在线程池中找一个线程去执行指定的逻辑,然后通过 await 返回 UI 线程";
  110. });
  111.  
  112. lblMsg.Text = result;
  113. }
  114. }
  115. }

ThreadPoolTimer -延迟执行, 周期执行的更多相关文章

  1. 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法

    [源码下载] 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 作者:webabcd 介绍重新想象 Wi ...

  2. ScheduledThreadPoolExecutor源码分析-你知道定时线程池是如何实现延迟执行和周期执行的吗?

    Java版本:8u261. 1 简介 ScheduledThreadPoolExecutor即定时线程池,是用来执行延迟任务或周期性任务的.相比于Timer的单线程,定时线程池在遇到任务抛出异常的时候 ...

  3. ScheduledExecutorService定时周期执行指定的任务

    示例代码 package com.effective.common.concurrent.execute; import java.text.DateFormat; import java.text. ...

  4. 运行时修改TimerTask的执行周期

    java.util.TimerTask类的执行周期period变量的声明如下: /** * Period in milliseconds for repeating tasks. A positive ...

  5. activity生命周期分析(两个activity之间跳转的生命周期执行顺序)

    NoteMainActivity点击跳转至NoteListActivity 我们都了解: 当A界面点击进入B界面时,此时         A===onPause--->onStop       ...

  6. vue父子组件生命周期执行顺序

    之前写了vue的生命周期,本以为明白了vue实例在创建到显示在页面上以及销毁等一系列过程,以及各个生命周期的特点.然而今天被问到父子组件生命周期执行顺序的时候一头雾水,根本不知道怎么回事.然后写了一段 ...

  7. React生命周期执行顺序详解

    文章内容转载于https://www.cnblogs.com/faith3/p/9216165.html 一.组件生命周期的执行次数是什么样子的??? 只执行一次: constructor.compo ...

  8. js多次触发事件,在一定延迟内只执行一次 (事件累加)

    js多次触发事件,在一定延迟内只执行一次的案例: <!DOCTYPE html> <html> <head> <meta charset="UTF- ...

  9. 【 PostgreSQL】后台周期执行函数实例(shell+crontab)

    工作中常见函数后台周期执行的情况,Oracle有job实现,gp数据库可以通过shell+crontab实现.流程如下: gpadmin用户下创建函数sh脚本. 将sh挂在crontab任务上 ### ...

随机推荐

  1. Oracle同义词

    Oracle的同义词(synonyms)从字面上理解就是别名的意思,和试图的功能类似,就是一种映射关系.本文介绍如何创建同义词语句,删除同义词以及查看同义词语句. Oracle的同义词总结:从字面上理 ...

  2. 回顾java基础—Java数据类型

    1  java数据类型.8种基本类型,3种引用类型 基本类型(也称:原始类型):byte.short.int.long.char.float.double.boolean 引用类型:类,接口,数组 2 ...

  3. 炫酷的html5(Drag 和 drop)拖放

    在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放.也是一种常见的特性,即抓取对象以后拖到另一个位置. 浏览器支持 Internet Explorer 9.Firefox.Opera 12.C ...

  4. CSS3 @font-face的使用

    首先我们一起来看看@font-face的语法规则: @font-face { font-family: <YourWebFontName>; src: <source> [&l ...

  5. UINavigationController

    知识点: 1)UINavigationController 2)UINavigationBar 3)UINavigationItem 4)UIToolBar ===================== ...

  6. iOS 如何使用Safari浏览器打开app

    1.首先在info.plist添加一个键值对,如下图 或 2.在appdelegate.m文件如下方法写代码 -(BOOL)application:(UIApplication*)app openUR ...

  7. java中IO流异常处理

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  8. 简历生成平台项目开发-STEP2问卷调查结果统计分析

    根据之前设计的调查问卷,截止目前为止,一共收到64份问卷结果.一共16题,分别从基本信息.是否对简历制作有需要.对产品期望的特点和建议采纳四个方面设计问题.下面逐题分析问卷结果: 1.您的性别 可以看 ...

  9. js 动态添加input代码

    <script type="text/javascript" language="javascript"> function newNode(thi ...

  10. 使用beautifulsoup与requests爬取数据

    1.安装需要的库 bs4 beautifulSoup  requests lxml如果使用mongodb存取数据,安装一下pymongo插件 2.常见问题 1> lxml安装问题 如果遇到lxm ...