c#入门-Task创建线程

这篇具有很好参考价值的文章主要介绍了c#入门-Task创建线程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

并发

在c#中,有线程类。激活线程对象就可以实现多线程。
不过,这是在代码角度来说的。你可以在代码中创建一万个线程。
但实际上你的cpu没有一万个逻辑处理器来真正同时执行这一万个线程。

所以我们称创建一万个线程为创建一万个并发——我们希望同时执行一万个线程,但实际上可能达不到。

CPU密集型

我们使用多线程,是为了充分利用(压榨)CPU的资源。
所以使用多线程来优化程序就有个前提条件,你要做的事情是需要CPU计算的。

与此对应的叫IO密集型。IO是指CPU和内存以外的东西交互数据。
可能是硬盘,可能是网络,或者是等待用户输入。
多线程无法帮助你加快这些过程。

Task

在c#中,最基本的线程创建方式,就是使用线程类。
但是线程的创建是极为消耗资源的。
控制程序如何运行是由程序栈控制。例如当前执行到哪一条指令,通过if选择后要跳转到哪一条指令。
以及调用方法时记录当前运行到哪里,当方法调用完成后从这里再继续。
线程之间是相互独立的,每个线程用的栈都是自己专属的。
创建一个线程就会同时创建一整个栈。默认情况下相当于25万个int的内存占用。

为了避免重复的创建和消灭造成的资源浪费。c#封装了一个线程池,可以重复利用休眠的线程。
但我们也不使用线程池创建线程,而是使用Task。

因为Task也是之后异步需要使用的内容。说好听叫降低学习成本。
Task使用的叫任务池,理念和线程池差不多。

Task.Run

Task.Run是一个静态方法,这是创建并执行一个Task最便捷的方法。
也可以使用他的构造器创建,但是这就需要手动调用开始执行方法。

Task.Run(() =>
{
	for (int i = 0; i < 200; i++)
	{
		Console.Write("x");
	}
}); 
for (int i = 0; i < 200; i++)
{
	Console.Write("y");
}

轮询

这个代码运行后效果应该类似于这样,并且有一些特点

yyyyyxxyyyyyyxxxyyyyyyyyyxxxyyxxyyxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyxxxxxxxxxxyyxyyyxxxyyxxyyyyxxyyxxyyxxyyxxxyyxxyyxxyyxxxyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxx

  • 有一堆x和y交错分布
  • 并且大概率会有一堆的相同字母连续
  • 每次执行结果都不一样

上述这三个特点都是因为线程的轮询机制。
你的电脑只有1到256个逻辑处理器,而打开你的任务管理器,即使刚刚开机也有数千个线程。
那么这样的任务如何分配呢?就是一会儿做这个线程,一会儿做那个线程。

  • 有一堆x和y交错分布:因为核心一会运行这个线程,一会运行那个线程
  • 一堆的相同字母连续:cpu一次运行一个线程会连续一定时间。执行完了才会执行别的线程。
  • 每次执行结果都不一样:线程的轮询难以预测。

后台线程

任务池内的线程(Task.Run使用的线程)默认为后台线程。
后台线程是指,如果没有任何一个前台线程继续运行,程序就会结束。后台线程会因为程序结束而被迫终止。

例如以下代码运行不会有任何输出。

Task.Run(() =>
{
	for (int i = 0; i < 200; i++)
	{
		Console.Write("x");
	}
}); 

而通过任意方式卡住程序,或者消耗一点时间,里面的内容才会输出文章来源地址https://www.toymoban.com/news/detail-427628.html

到了这里,关于c#入门-Task创建线程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#中多线程Task详解

    参考文章: 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 1.1Thread方式 缺点:频繁的创建和消耗比较好资源;提供操作线程的API不是马上响应(线程是

    2024年02月04日
    浏览(46)
  • C++并发与多线程笔记八:async、future、packaged_task、promise

    本文接上文 C++并发与多线程笔记七:condition_variable、wait、notify_one/all 的内容,主要记录 async、future、packaged_task、promise 概念以及用法。 2.1 基本用法 std::async 是个函数模板,用来启动一个异步任务,启动一个异步任务后,它返回一个 std::future 类模板对象。 上述\\\"启动一个异步

    2023年04月13日
    浏览(46)
  • C++11并发与多线程笔记(9) async、future、packaged_task、promise

    std::async : 是一个函数模板,用来启动一个异步任务,启动起来一个异步任务之后,它返回一个std::future对象,这个对象是个类模板。 什么叫“ 启动一个异步任务 ”?就是自动创建一个线程,并开始执行对应的线程入口函数,它返回一个std::future对象,这个std::future对象中就

    2024年02月12日
    浏览(41)
  • C# Task Parallel Library (TPL) 访问线程池

    //在C#中,可以使用Task Parallel Library (TPL)来访问线程池。 //TPL是一个用于并行编程的框架,它提供了一种简单的方式来创建并行任务, //并 自动利用线程池 来执行这些任务。 //下面是一个使用TPL访问线程池的示例: //csharp using System; using System.Threading.Tasks; class Program {     st

    2024年02月08日
    浏览(79)
  • WPF跨线程访问UI对象之Dispatcher的用法(含Task)

    WPF程序员处理多线程的一个方式 - Dispatcher 当我们打开一个WPF应用程序即开启了一个进程,该进程中至少包含两个线程。 一个线程用于处理呈现:隐藏在后台运行 一个线程用于管理用户界面:接收输入、处理事件、绘制屏幕以及运行应用程序代码。即UI线程。 在UI线程中有一

    2024年02月16日
    浏览(41)
  • C#学习相关系列之多线程(七)---Task的相关属性用法

    任务是 架构在线程之上 的,任务最终的执行还是要给到线程去执行的。 任务和线程之间不是一对一的关系,任务更像线程池,任务相比线程池有很小的开销和精确的控制。 (总的来说Task的用法更为先进,在多线程的时候应该优先考虑Task) 1. status 当前状态类属性(较多)  C

    2024年02月06日
    浏览(34)
  • C# 使用屏障来使多线程并发操作保持同步

    以下是微软官方对屏障类的介绍,System.Threading.Barrier 可用来作为实现并发同步操作的基本单元,让多个线程(参与者)分阶段并行处理目标算法。在达到代码中的屏障点之前,每个参与者将继续执行,屏障表示工作阶段的末尾;单个参与者到达屏障后将被阻止,直至所有参与者

    2024年01月24日
    浏览(45)
  • 【深入浅出C#】章节 9: C#高级主题:多线程编程和并发处理

    多线程编程和并发处理的重要性和背景 在计算机科学领域,多线程编程和并发处理是一种关键技术,旨在充分利用现代计算机系统中的多核处理器和多任务能力。随着计算机硬件的发展,单一的中央处理单元(CPU)已经不再是主流,取而代之的是多核处理器,这使得同时执行

    2024年02月11日
    浏览(58)
  • Java并发(三)----创建线程的三种方式及查看进程线程

    例如: 输出 注意:这里通过 @Slf4j 注解打印的日志 把【线程】和【任务】(要执行的代码)分开 Thread 代表线程 Runnable 可运行的任务(线程要执行的代码) 例如: 输出 Java 8 以后可以使用 lambda 精简代码 小结 方法1 是把线程和任务合并在了一起,方法2 是把线程和任务分开

    2023年04月24日
    浏览(50)
  • 【并发编程】SpringBoot创建线程池的六种方式

    1. 自定义线程池 1.1 示例代码   控制台打印: 2. 固定长度线程池 2.1 示例代码   控制台打印:   前3个任务被同时执行,因为刚好有3个核心线程。后2个任务会被存放到阻塞队列,当执行前3个任务的某个线程空闲时会从队列中获取任务并执行。 2.2 源码剖析   该类型

    2024年02月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包