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博客


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

杂记 | 在Linux上使用Docker-compose安装单机版Milvus向量数据库并配置访问控制和可视化面板(Attu)

文章目录 01 Milvus向量数据库简介02 安装前的准备03 安装3.1 创建milvus工作目录3.2 下载并编辑docker-compose.yml3.3 下载milvus.yml文件3.4 启动milvus 04 访问可视化面板并修改密码 01 Milvus向量数据库简介 Milvus是一款开源的向量数据库&#xff0c;它专为AI应用设计&a…

Docker(三)使用 Docker 镜像:从仓库获取镜像;管理本地主机上的镜像;介绍镜像实现的基本原理

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 使用 Docker 镜像 在之前的介绍中&#xff0c;我们知道镜像是 Docker 的三大组件之一。 Docker 运行容器前需要本地存在对应的镜像&#x…

IaC基础设施即代码:Terraform 使用 dynamic动态内联块 创建docker资源

目录 一、实验 1.环境 2.Terraform查看版本 3.Linux主机安装Docker 4.Terraform使用本地编译&#xff08;In-house&#xff09;的Providers 5.Docker-CE 开启远程API 6. Linux主机拉取镜像 7.Terraform 使用 dynamic动态内联块 创建资源 二、问题 1.Terraform 计划资源…

精品基于Uniapp+springboot校园学校趣事管理系统app

《[含文档PPT源码等]精品基于Uniappspringboot趣事管理系统app》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm 安卓…

Unity vs Godot :哪个游戏引擎更适合你?

Unity vs Godot &#xff1a;哪个游戏引擎更适合你&#xff1f; 游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来&#xff0c;Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较&#xff0c;以期为开发者提供正确的选择建议。 Godot和Unity都有…

Backtrader 文档学习-Indicators混合时间框架

Backtrader 文档学习-Indicators混合时间周期 1.不同时间周期 如果数据源在Cerebro引擎中具有不同的时间范围和不同的长度&#xff0c;指示器将会终止。 比如&#xff1a;data0是日线&#xff0c;data1是月线 。 pivotpoint btind.PivotPoint(self.data1) sellsignal self…

IMDB电影评论的情感分析——paddle

项目地址&#xff1a;IMDB电影评论的情感分析 - 飞桨AI Studio星河社区 (baidu.com) 1. 实验介绍 1.1 实验目的 理解并掌握循环神经网络的基础知识点&#xff0c;包括模型的时序结构、模型的前向传播、反向传播等掌握长短时记忆网络LSTM和门控循环单元网络GRU的设计原理熟悉如…

Halcon基于形变的模板匹配

Halcon基于形变的模板匹配 形变分为两种&#xff0c;一种是基于目标局部的形变&#xff0c;另一种是由于透视关系而产生的形变。基于形变的模板匹配也是一种基于形状的匹配方法&#xff0c;但不同的是&#xff0c;其返回结果中不仅包括轻微形变的形状.形变的位置和参数&#x…

Node.js基础知识点(五)- http

一.request 请求事件处理函数 var http require(http)var server http.createServer() request 请求事件处理函数&#xff0c;需要接收两个参数&#xff1a; Request 请求对象 请求对象可以用来获取客户端的一些请求信息&#xff0c;例如请求路径 Response 响应对象 响应对…

神器yakit之web fuzzer功能

前言 yakit并不像burp一样单独设置爆破模块&#xff0c;但是yakit也是可以爆破的&#xff0c;并且更好用&#xff08;个人感觉&#xff09;。 手工测试场景中需要渗透人员对报文进行反复的发送畸形或者特定的payload进行查看服务器的反馈并以此来进行下一步的判断。 Fuzz标签便…

Verilog基础:强度建模(二)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 三、拥有单个强度和确定值的net型信号的线与组合&#xff08;线网多驱动&#xff09; 首先来说明一下什么叫信号拥有单个强度和确定值&#xff0c;其实如果一个ne…

Vue中的日历组件 Calendar 实现 考勤打卡记录

日历组件 Calendar 可以自定义在页面添加内容。 实现效果图 1.由于Calendar没有右上角月份切换的API事件&#xff0c;可以给组件源码添加自定义添加一个事件 2.也可以通过自带的input事件来获取日历 3.vue页面完整代码 注释&#xff1a;this.$m(this.beginTime).format(…

Halcon 一维测量

文章目录 算子矩形算子弧形算子移动到新的参考点 Halcon 案例测量保险丝的宽度&#xff08;边缘对测量&#xff09;使用助手进行测量 halcon 案例获取芯片引脚的个数平均宽度距离&#xff0c;连续两个边缘的距离&#xff08;measure_pos &#xff09;halcon 定位测量Halcon 测量…

Java基础面试题-2day

面向对象 创建一个对象用什么运算符&#xff0c;对象实体和对象引用有什么不同&#xff1f; 创建对象使用new String A new String(); A即为对象引用&#xff0c;通过new运算符&#xff0c;创建String()类型的对象实体。 对象引用的存储位置在栈内存 对象实体的存储位置在堆…

【算法】使用优先级队列(堆)解决算法题(TopK等)(C++)

文章目录 1. 前言2. 算法题1046.最后一块石头的重量703.数据流中的第K大元素 2.5 如何选择大根堆 与 小根堆&#xff1f; 为什么选择大根堆&#xff08;小根堆&#xff09;&#xff1f;692.前K个高频单词295.数据流的中位数 1. 前言 我们知道&#xff1a;优先级队列是一种常用…

Maven 基础安装配置及使用

大家好我是苏麟 , 今天聊聊Maven . Maven Maven , 是Apache公司下基于Java开发的开源项目 . 我们构建一个项目需要用到很多第三方的类库&#xff0c;需要引入大量的jar包。一个项目Jar包的数量之多往往让我们瞠目结舌&#xff0c;并且Jar包之间的关系错综复杂&#xff0c;一…

高并发缓存问题分析以及分布式锁的实现

一,场景概述: 在高并发的环境下,比如淘宝,京东不定时的促销活动,大量的用户访问会导致数据库的性能下降,进而有可能数据库宕机从而不能产生正常的服务,一般一个系统最大的性能瓶颈&#xff0c;就是数据库的io操作,如果发生大量的io那么他的问题也会随之而来。从数据库入手也是…

Python | 六、哈希表 Hash Table(列表、集合、映射)

哈希表基础 哈希表是一类数据结构&#xff08;哈希表包含数组、集合和映射&#xff0c;和前两篇文章叙述的字符串、链表平级&#xff09;哈希表概念&#xff1a;类似于Python里的字典类型&#xff0c;哈希表把关键码key值通过哈希函数来和哈希表上的索引对应起来&#xff0c;之…

力扣第236题——二叉树的最近公共祖先 (C语言题解)

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以…

【论文总结】基于深度学习的特征点提取,特征点检测的方法总结

这里写目录标题 相关工作1. Discriminative Learning of Deep Convolutional Feature Point Descriptors(2015)网络结构sift算法损失函数的构建 2.MatchNet(2015)网络中的组成部分其他组成部分损失函数结果 3.LIFT: Learned Invariant Feature Transform(2016)网络结构训练网络…