C# new Thread和Task.Run,多线程(Thread和Task)

一、开启多线程-new Thread的使用

示例一

Thread thread25yi = new Thread(new ThreadStart(obj.MethodTimer1)); 
thread25yi.Start(); 

void MethodTimer1() 
{ 
	while (true) 
	{ 
		Console.WriteLine(DateTime.Now.ToString() + "_" + thread25yi.CurrentThread.ManagedThreadId.ToString()); 
		thread25yi.CurrentThread.Join(100);//阻止设定时间 
	} 
}

示例二

Thread thread = new Thread((s) =>
{
	//你的代码
	Socket serSocket = (Socket)s;
};

//获取或设置一个值,该值指示某个线程是否为后台线程。
thread.IsBackground = true;

//参数:寻址方式  传输数据方式 通信协议
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//开启线程并传参
//导致操作系统将当前实例的状态更改为 System.Threading.ThreadState.Running,并选择提供包含线程执行的方法要使用的数据的对象。
thread.Start(socket);//开启并传参

二、开启多线程- Task.Run的使用

示例一:语法代码 

Task.Run(() =>
{
	try
	{
		//你的代码
	}
	catch (Exception e)
	{
		//你的代码
	}
}

示例二:完整示例代码

程序环境:

程序:WindowsForms(windows窗体)

FW版本:.NET Framework 4.5

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsAccess_Shift_MSServer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Task.Run(()=> {
                this.GetData();
            });
        }
        private delegate void richTextBoxCallBack();
        private void GetData() {
 
           
            for (int i = 0; i < 99; i++)
            {
                richTextBoxCallBack richTextBoxCallBack = delegate () {
                    SucceedRichTextBox.AppendText(i + "_行\n");
                };
                SucceedRichTextBox.Invoke(richTextBoxCallBack);
                Thread.Sleep(2000);
            }
        }
 
        private void label1_Click(object sender, EventArgs e)
        {
 
        }
    }
}

三、开启子线程后,想调用父线程的方法

这里会有个错误提示,如下:

线程间操作无效: 从不是创建控件的线程访问它

解决办法:C# 线程间操作无效: 从不是创建控件的线程访问它--多线程操作-CSDN博客 


延伸阅读

内容来自:总结C#多线程(Thread和Task)_c# task thread-CSDN博客

线程(Thread)是进程中的基本执行单元,是操作系统分配CPU时间的基本单位,一个进程可以包含若干个线程,在进程入口执行的第一个线程被视为这个进程的主线程。以下内容介绍C# Thread和Task实现多线程。

1、C# 线程介绍


进程作为操作系统执行程序的基本单位,拥有应用程序的资源,进程包含线程,进程的资源被线程共享,线程不拥有资源。通过Thread类新建线程默认为前台线程。当所有前台线程关闭时,所有的后台线程也会被直接终止,不会抛出异常。由于线程的执行顺序和程序的执行情况不可预知,所以使用挂起和唤醒容易发生死锁的情况,在实际应用中应该尽量少用。

使用线程的作用:

1)可以使用线程将代码同其他代码隔离,提高应用程序的可靠性。

2)可以使用线程来简化编码。

3)可以使用线程来实现并发执行。
 

2、线程的使用

C# 中多线程的使用可以通过System.Threading.Thread 实现,也可以通过System.Threading.Tasks.Task实现.

System.Threading.Thread 类用于线程的工作。它允许创建并访问多线程应用程序中的单个线程。进程中第一个被执行的线程称为主线程。

当 C# 程序开始执行时,主线程自动创建。使用 Thread 类创建的线程被主线程的子线程调用。可以使用 Thread 类的 CurrentThread 属性访问线程Task是.NET4.0加入的,与线程池ThreadPool的功能类似,用Task开启新任务时,会从线程池中调用线程,而Thread每次实例化都会创建一个新的线程。我们可以说Task是一种基于任务的编程模型。它与Thread的主要区别是,更加方便对线程进程调度和获取线程的执行结果。并且Task是针对多核有优化。
 

2.1使用Thread

using System;
using System.Threading;
//简单的线程场景:启动一个静态方法运行
//第二个线程。
public class ThreadExample
{
 //线程启动时调用ThreadProc方法。
 //它循环10次,写入控制台和屈服
 //每个时间片的剩余部分,然后结束。
 public static void ThreadProc()
 {
 for (int i = 0; i < 10; i++)
 {
 Console.WriteLine("ThreadProc: {0}", i);
 //生成剩余的时间片。
 Thread.Sleep(0);
 }
 }
 public static void Main()
 {
 Console.WriteLine("主线程:启动第二个线程。");
 //线程类的构造函数需要一个ThreadStart
 //对象上要执行的方法的线程。
 //c#简化了这个委托的创建。
 Thread t = new Thread(new ThreadStart(ThreadProc));
 // 开始ThreadProc。请注意,在单处理器上,新的
 //线程没有得到任何处理器时间,直到主线程
 //被抢占或产生。取消线程。睡眠
 //使用t.Start()来查看区别。
 //可以通过提供委托来启动线程,该委托表示线程在其类构造函数中执行的方法。 然后调用 Start 方法开始执行。
 t.Start();
 //Thread.Sleep(0);
 for (int i = 0; i < 4; i++)
 {
 Console.WriteLine("主线程: 执行方法。");
 Thread.Sleep(0);
 }
 Console.WriteLine("主线程:调用Join(),等待线程进程结束。");
 t.Join();
 Console.WriteLine("主线程:ThreadProc。加入已恢复。按“Enter”结束程序。");
 Console.ReadLine();
 }
}

注意:进程启动时,公共语言运行时将自动创建单个前台线程以执行应用程序代码。 除了此主前台线程,进程还可以创建一个或多个线程来执行与进程关联的程序代码的一部分。 这些线程可以在前台或后台执行。 此外,还可以使用 ThreadPool 类来执行由公共语言运行时管理的工作线程上的代码。

2.2使用Task

下面的示例创建并执行四个任务。 三个任务执行 Action<T> 名为的委托 action ,该委托接受类型的参数 Object 。 第四个任务执行 lambda 表达式 (Action 委托) ,该委托在对任务创建方法的调用中以内联方式定义。 每个任务实例化并以不同的方式运行:

例如:

using System;
using System.Threading;
using System.Threading.Tasks;
class Example
{
 static void Main()
 {
 Action<object> action = (object obj) =>
 {
 Console.WriteLine("Task={0}, obj={1}, Thread={2}",
 Task.CurrentId, obj,
 Thread.CurrentThread.ManagedThreadId);
 };
 // 创建一个任务但不启动它。
 Task t1 = new Task(action, "alpha");
 // 构造一个已启动的任务
 Task t2 = Task.Factory.StartNew(action, "beta");
 // 阻塞主线程以演示t2正在执行
 t2.Wait();
 // 启动 t1 
 t1.Start();
 Console.WriteLine("t1 has been launched. (Main Thread={0})",
 Thread.CurrentThread.ManagedThreadId);
 // 等待任务完成。
 t1.Wait();
 // 使用Task.Run构造一个已启动的任务。
 String taskData = "delta";
 Task t3 = Task.Run(() => {
 Console.WriteLine("Task={0}, obj={1}, Thread={2}",
 Task.CurrentId, taskData,
 Thread.CurrentThread.ManagedThreadId);
 });
 // 等待任务完成。
 t3.Wait();
 // 构造一个未启动的任务
 Task t4 = new Task(action, "gamma");
 // 同步运行它
 t4.RunSynchronously();
 //虽然任务是同步运行的,但这是一个很好的实践
 //在任务抛出异常时等待它。
 t4.Wait();
 }
}

Task 可以通过多种方式创建实例。 从 .NET Framework 4.5 开始,最常见的方法是调用静态 Run 方法。 Run方法提供了一种简单的方法来使用默认值启动任务,而无需其他参数。

例如

using System;
using System.Threading.Tasks;
public class Example
{
 public static async Task Main()
 {
 await Task.Run( () => {
 int ctr = 0;
 for (ctr = 0; ctr <= 1000000; ctr++)
 {}
 Console.WriteLine("Finished {0} loop iterations",
 ctr);
 } );
 }
}

.NET Framework 4 中启动任务的最常见方法,是静态 TaskFactory.StartNew 方法。 Task.Factory属性返回 TaskFactory 对象。 方法的重载 TaskFactory.StartNew 使你可以指定要传递给任务创建选项和任务计划程序的参数。 

例如

using System;
using System.Threading.Tasks;
 
public class Example
{
 public static void Main()
 {
 Task t = Task.Factory.StartNew( () => {
 int ctr = 0;
 for (ctr = 0; ctr <= 1000000; ctr++)
 {}
 Console.WriteLine("Finished {0} loop iterations",
 ctr);
 } );
 t.Wait();
 }
}

  3、Thread和Task常用属性和方法

更多请阅读原文:

总结C#多线程(Thread和Task)_c# task thread-CSDN博客


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/322177.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

宿舍维修管理系统:从数据库到前端的全面解析

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

低代码表单引擎: API接口数据打造高效表单下拉组件的关键

在当今的数字化时代&#xff0c;用户界面组件在应用程序开发中扮演着至关重要的角色。一个好的组件不仅可以提高用户体验&#xff0c;还可以简化开发过程。在各种用户界面组件中&#xff0c;下拉框是一个常见且实用的组件&#xff0c;它允许用户从一系列选项中进行选择。当这些…

1.IHRM人力资源后台 - 项目搭建

IHRM人力资源 - 项目搭建 文章目录 IHRM人力资源 - 项目搭建一、项目搭建1.1 项目搭建1.2 项目目录1.2.1 src 目录 1.3 App.vue 根组件解析1.4 基础设置 settings.js1.5 导航守卫 permission.js1.6 VUEX 二、 图标使用2.1 图标使用2.2 Icon 图标的解析 一、项目搭建 1.1 项目搭…

Cypress安装与使用教程(4)—— 软测大玩家

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

一篇搞明白微信的基本授权功能

一、介绍 由于部分接口需要经过用户授权同意才能调用。我们把这些接口按使用范围分成多个 scope , 用户选择对 scope 来进行授权&#xff0c;当授权给一个 scope 之后&#xff0c;其对应的所有接口都可以直接使用。 此类接口调用时&#xff1a; 如果用户未接受或拒绝过此权限…

2.IHRM人力资源 - 登录

一、登录页结构与表单开发 我们要实现的登录界面 目前的登录界面 1.1 登录页结构 复制下面的代码到views/login/index.vue页面下 <template><div class"login-container"><div class"logo"/><div class"form"><h1&…

使用 Jamf Pro 和 Okta 工作流程实现自动化苹果设备管理

Jamf的销售工程师Vincent Bonnin与Okta的产品经理Emily Wendell一起介绍了JNUC 2021的操作方法会议。它们涵盖了Okta工作流程&#xff08;Okta Workflow&#xff09;&#xff0c;并在其中集成了Jamf Pro&#xff0c;构建了一些工作流程&#xff0c;并提供了几个用例。 Okta 工作…

MySQL加锁规则

项目编写涉及到数据持久化一般选择使用MySQL。由于时间原因&#xff0c;数据库使用我选择了无脑三板斧&#xff1a;1. 建立了索引加速查询、2. 关闭自动提交事务、3. 在需要确保原子性的数据库操作之间手动创建和提交事务。 这么一看&#xff0c;仿佛即使是实际开发也与你此前…

什么是充放电振子理论?

CHAT回复&#xff1a;充放电振子模型&#xff08;Charging-Reversal Oscillator Model&#xff09;是一种解释ENSO现象的理论模型&#xff0c;这个模型把ENSO现象比喻成一个“热力学振荡系统”。 在这个模型中&#xff0c;ENSO现象由三个组成部分&#xff1a;充电&#xff08;C…

利用CHAT写实验结论

问CHAT&#xff1a;通过观察放置在玻璃表面上的单个水滴&#xff0c;人们可以观察到水滴充当成像系统。探究这样一个透镜的放大倍数和分辨率。 CHAT回复&#xff1a;实验报告标题&#xff1a;利用玻璃表面的单一水滴观察成像系统的放大倍数和分辨率&#xff1a; 一、 实验目的…

你不得不知道的常用 Git 命令

最近在学习的时候发现 git 命令没有自己想象中那么简单&#xff0c;特此做一期 《 常用 Git 命令 》&#xff0c;不仅是给掘友分享&#xff0c;也能巩固自己学到的知识。 在此向大家推荐一个学习 git 指令的小游戏 Learn Git Branching&#xff0c;以通关的方式进行学习&#…

鸿蒙Harmony--状态管理器-@Observed装饰器和@ObjectLink装饰器详解

经历的越多&#xff0c;越喜欢简单的生活&#xff0c;干净的东西&#xff0c;清楚的感觉&#xff0c;有结果的事&#xff0c;和说到做到的人。把圈子变小&#xff0c;把语放缓&#xff0c;把心放宽&#xff0c;用心做好手边的事儿&#xff0c;该有的总会有的! 目录 一&#xff…

【壹基金儿童服务站瑞金站】寿司DIY亲子活动火热进行

1月13日下午&#xff0c;“大灰狼来啦....”在小朋友们一声声欢快律动的游戏里在象湖新城小区拉开了一场“寿司DIY”亲子主题活动序幕&#xff0c;活动由壹基金儿童服务站瑞金站&#xff08;瑞金赋能公益&#xff09;和爱心商家安心妈妈飞鹤奶粉联合主办。 热身游戏结束后&…

链接全域直播产业经济,天府锋巢直播产业基地10层正式起航

100㎡-400㎡多种类型的办公户型可选 精装全包 拎包入驻 【天府锋巢直播基地】 由德商产投与无锋科技联袂打造 坐落于天府新区核心区域科学城板块 包含电商直播、娱乐直播、跨境直播 多种直播业态的全域直播基地 基地【10层】于12月初全面竣工 招&#xff5c;商 &#xff5c;火&…

Jan, 一个开源 ChatGPT 替代品

Jan 是一个开源 ChatGPT 替代品&#xff0c;可以在您的计算机上 100% 离线运行。 Jan 可以在任何硬件上运行。从 PC 到多 GPU 集群&#xff0c;Jan 支持通用架构&#xff1a; Nvidia GPU&#xff08;快速&#xff09;Apple M 系列&#xff08;快速&#xff09;苹果英特尔Linu…

LLM之RAG实战(十五)| RAG的自动源引文验证技术

​ 在过去的一年里&#xff0c;检索增强生成&#xff08;RAG&#xff09;已经成为一种基于LLM的流行架构&#xff0c;旨在解决在基于知识的LLM最常见的挑战之一&#xff0c;可怕的幻觉。 一、RAG如何解决幻觉&#xff1f; RAG Pipeline包括两个关键组件&#xff1a;&…

基于Java SSM框架实现摄影器材租赁系统项目【项目源码+论文说明】

基于java的SSM框架实现摄影器材租赁系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&a…

Linux(Centos7)安装 jenkins(jdk11+jenkins2.375),并配置JDK,Maven,Git,GitLab

安装步骤 1. JDK11安装2. Maven安装3. git安装4. Jenkins2.375安装4.1 设置中文显示4.2 端口,用户权限修改4.3 插件下载4.4 全局工具配置4.4.1 Maven配置4.4.2 JDK配置4.4.3 Git配置 4.5 系统配置4.5.1 Gitee配置 4.6 构建测试 1. JDK11安装 #下载 yum -y install fontconfig …

怎样获取power shell 的全部可用命令?2/5(篇幅有点长,分成5份)

在power shell 窗口中&#xff0c;有一个获取全部可用命令的命令&#xff1a;get-command&#xff0c;获取到的命令有1640多个&#xff0c;够学习了吧&#xff1f;那么&#xff0c;power shell 命令有哪些类别呢&#xff1f; PowerShell命令可以分为以下几类&#xff1a; Cmdl…

高可用架构去中心化重要?

1 背景 在互联网高可用架构设计中&#xff0c;应该避免将所有的控制权都集中到一个中心服务&#xff0c;即便这个中心服务是多副本模式。 对某个中心服务&#xff08;组件&#xff09;的过渡强依赖&#xff0c;那等同于把命脉掌握在依赖方手里&#xff0c;依赖方的任何问题都可…