原文:win10 uwp 线程池

如果大家有开发 WPF 或以前的程序,大概知道线程池不是 UWP 创造的,实际上在很多技术都用到线程池。
为什么需要线程池,他是什么?如何在 UWP 使用线程池,本文就是来告诉大家这些

为什么需要线程池

在程序中,创建和销毁线程是需要很多资源的,如果只是为了完成很小的代码而创建一个新的线程,创建线程占用的时间在总的运行时间占有比例很大。所以大神就说,那就不创建线程了。

因为花费总时间划不来,所以大神就想直接创建一个线程,也不销毁,一旦用户需要一个新线程去做一些事情,就把这个线程给他。这样就可以省略了创建和销毁线程时间,减少了花费总时间。

什么是线程池

百度说线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。

在 C# 中,线程池只是预先分配了一些线程,线程没事做就休息,有工作需要就随便叫一个线程出来。通过这个方法减少创建线程的时间。

线程池原理

在 C# 大家都知道,执行一个方法,如果需要把方法传到另一个时间去调用,就可以使用委托。而创建一个线程去做其他的事情,实际上可以认为是把一个委托传入一个线程,让这个线程使用。线程池就是先创建了很多线程,用户调用就是传入方法,线程池拿出一个空闲的线程去执行传入的方法。

最简单的模拟代码就是创建一个线程,然后让他运行一个委托,运行完成设置这个委托为空。

        private Action _action;

            new Thread(() =>
{
while (true)
{
_action?.Invoke();
_action = null;
}
}).Start();

上面代码是无法在 UWP 运行的,只是告诉大家原理。

因为做这个线程池需要很多代码,如判断设备运行多少个线程合适,分配空闲线程等。好像微软已经弄好了,大家只需要用。

应用

大家从原理可以知道,线程池运行代码,不是立刻运行的,假如线程池有10个线程,刚好都在做其他事情,这时请线程池运行新的代码,就会等待线程池存在空闲线程。

千万不要使用线程池执行比较紧急的任务,因为可能等待很多时间都没运行。

在 UWP 可以通过 ThreadPool 使用线程池。

            var thread = ThreadPool.RunAsync(e =>
{
Debug.WriteLine("使用线程池很简单");
});

使用的方法十分简单,传入一个委托就可以。

等待代码完成

很多时候的线程模型就是需要运行很多并行代码,在运行完成再运行串行的代码。

这时就需要使用线程池运行代码,还需要等待代码运行完成

例如我需要下载 lindexi.github.io 所有博客,获得所有文章只能使用一个线程获取,但是下载所有博客就可以并行。在所有下载完成还需要告诉用户,这时只能使用一个线程。

            var url = "lindexi.github.io";

            // 获取所有文章
var aritcle = GetArticle(url); var threadList = new List<IAsyncAction>(); foreach (var temp in aritcle)
{
threadList.Add(ThreadPool.RunAsync(e =>
{
Download(temp);
}));
} Task.WaitAll(threadList.Select(temp => temp.AsTask()).ToArray()); Debug.WriteLine("下载完所有博客");

定时器

如果需要一个定时器,除了使用主线程的定时器,还可以使用 ThreadPoolTimer ,创建一个定时器很简单,请看代码

            ThreadPoolTimer.CreateTimer(timer =>
{
Debug.WriteLine("下载完所有博客");
}, new TimeSpan(0, 0, 0, 1));

实际上从效果,可以把上面的代码认为是

            Task.Delay(new TimeSpan(0, 0, 0, 1)).ContinueWith(_ =>
{
Debug.WriteLine("下载完所有博客");
});

如果需要重复执行,请使用 CreatePeriodicTimer ,这个函数可以延迟大于指定的时间执行代码

            ThreadPoolTimer.CreatePeriodicTimer(timer =>
{
Debug.WriteLine("下载完所有博客");
}, new TimeSpan(0, 0, 0, 1));

如果想让软件代码不会被大神喷,那么请看一下使用线程池的最佳做法


本文会经常更新,请阅读原文:
https://lindexi.gitee.io/lindexi/post/win10-uwp-%E7%BA%BF%E7%A8%8B%E6%B1%A0.html
,以避免陈旧错误知识的误导,同时有更好的阅读体验。


本作品采用
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:
https://lindexi.gitee.io
),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请
与我联系

win10 uwp 线程池的更多相关文章

  1. 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq

    常量,字段,构造方法   常量 1.什么是常量 ​ 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...

  2. win10 uwp MVVM 轻量框架

    如果在开发过程,遇到多个页面之间,需要传输信息,那么可能遇到设计的问题.如果因为一个页面内包含多个子页面和多个子页面之间的通信问题找不到一个好的解决方法,那么请看本文.如果因为ViewModel代码越 ...

  3. .NET线程池最大线程数的限制-记一次IIS并发瓶颈

    .NET ThreadPool 最大线程数的限制 IIS并发瓶颈,有几个地方,IIS线程池的最大队列数,工作进程数,最大并发数.这些这里就不展开.主要是最近因为过度使用Task 导致的线程数占用过多, ...

  4. win10 uwp 渲染原理 DirectComposition 渲染

    本文来告诉大家一个新的技术DirectComposition,在 win7 之后(实际上是 vista),微软正在考虑一个新的渲染机制 在 Windows Vista 就引入了一个服务,桌面窗口管理器 ...

  5. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  6. C#多线程之线程池篇3

    在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...

  7. C#多线程之线程池篇2

    在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...

  8. C#多线程之线程池篇1

    在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...

  9. NGINX引入线程池 性能提升9倍

    1. 引言 正如我们所知,NGINX采用了异步.事件驱动的方法来处理连接.这种处理方式无需(像使用传统架构的服务器一样)为每个请求创建额外的专用进程或者线程,而是在一个工作进程中处理多个连接和请求.为 ...

随机推荐

  1. docker中发布springboot

    http://note.youdao.com/noteshare?id=81a603b1b33731aaef7b7755c70f33fb

  2. POJ 2236 Wireless Network ||POJ 1703 Find them, Catch them 并查集

    POJ 2236 Wireless Network http://poj.org/problem?id=2236 题目大意: 给你N台损坏的电脑坐标,这些电脑只能与不超过距离d的电脑通信,但如果x和y ...

  3. HttpWatch--time chart分析

    这是一个IE的插件,下载可以点这里.下载后解压如下图所示,一共有4个文件.HttpWatch Professional是单独软件,可以单独使用. 解压后有四个文件 插件安装时,只需运行httpwatc ...

  4. python中线程、进程和协程的区别

    进程是资源分配的单位 线程是操作系统调度的单位 协程,又称微线程,纤程,协程的切换只是单纯的操作CPU的上下文,资源很小,效率高 进程切换需要的资源很最大,效率很低 一个程序至少有一个进程,一个进程至 ...

  5. SpringMVC 学习笔记(十) 异常处理HandlerExceptionResolver

    Spring MVC 通过 HandlerExceptionResolver 处理程序的异常,包含 Handler 映射.数据绑定以及目标方法运行时发生的异常. SpringMVC 提供的 Handl ...

  6. Css fixed和absolute定位差别

    fixed:固定定位 absolute:绝对定位 差别非常easy: 1.没有滚动栏的情况下没有差异 2.在有滚动栏的情况下.fixed定位不会随滚动栏移动而移动.而absolute则会随滚动栏移动 ...

  7. [HTML] Change an HTML5 input's placeholder color with CSS

    We will look at what CSS selectors to use to change an HTML5 inputs placeholder color. This can diff ...

  8. disabled的值无法传递到action层

    假设想让表单不可输入的状态,我将表单设置为了: style="cursor:not-allowed;" disabled 可是这样设置之后就发现,在后台的action怎么都没有办法 ...

  9. Linux 系统挂载数据盘 分类: B3_LINUX 2015-01-30 18:13 228人阅读 评论(0) 收藏

    适用系统:Linux(Redhat , CentOS,Debian,Ubuntu) *  Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化操作. 下面的操作将会把数据盘划 ...

  10. thinkphp 3.2 updateFields 设置之后保存失败

    // 检测提交字段的合法性 if(isset($this->options['field'])) { // $this->field('field1,field2...')->cre ...