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

news2024/12/26 22:41:50

一、开启多线程-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.coloradmin.cn/o/1390340.html

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

相关文章

Github搭建图床 github搭建静态资源库 免费CDN加速 github搭建图床使用 jsdelivr CDN免费加速访问

Github搭建图床 github搭建静态资源库 免费CDN加速 github搭建图床使用 jsdelivr CDN免费加速访问 前言1、创建仓库2、开启 gh-pages页面功能3、访问测试 前言 写博客文章时&#xff0c;图片的上传和存放是一个问题&#xff0c;使用小众第三方图床&#xff0c;怕不稳定和倒闭&…

【SpringMVC】常用注解(续)

在SpringMVC常用注解一文中&#xff0c;已经对一些基本注解&#xff08;有Controller、RequestMapping、ResponseBody、RequestParam&#xff09;进行了简单介绍&#xff1b;在此篇文章中&#xff0c;将继续对剩余的几个常用注解进行简单介绍&#xff0c;有RequestBody、PathVa…

测试平台出问题?看我20分钟快速定位!

今天遇到一个问题&#xff0c;感觉挺有意思&#xff0c;处理过程也非常有意义&#xff0c;希望能给大家一个借鉴吧。今天一位小姐姐找到了我们大组长&#xff0c;说测试平台添加自动化测试用例失败&#xff0c;之后我们组长把我拉到了一个群里让我去看一下&#xff0c;硬着头皮…

uniapp 简易自定义日历

1、组件代码 gy-calendar-self.vue <template><view class"calendar"><view class"selsct-date">请选择预约日期</view><!-- 日历头部&#xff0c;显示星期 --><view class"weekdays"><view v-for"…

k8s存储卷-动态PV

pv和PVC&#xff0c;存储卷&#xff1a; 存储卷&#xff1a; EmptyDir&#xff1a;容器内部&#xff0c;随着pod销毁&#xff0c;emptyDir也会消失&#xff0c;不能做数据持久化 HostPath&#xff1a;持久化存储数据&#xff0c;可以和节点上目录做挂载&#xff0c;pod被销毁…

vue el-table 多选框回填

主要代码: //选中列&#xff0c;所有列&#xff0c;表名toggleSelection(selectRows, totalRows, tablename) {this.$refs.table.clearSelection();if (selectRows.length > 0) {this.$nextTick(() > {selectRows.forEach(item > {totalRows.forEach(item1 > {if (…

PyTorch常用操作

0. 先决条件 安装驱动、CUDA、cuDNN&#xff0c;请参考&#xff1a;https://blog.csdn.net/liugan528/article/details/128974129 import torch print(torch.__version__)#查看gpu是否可用 print(torch.cuda.is_available())#查看设备gpu个数 print(torch.cuda.device_count(…

数据结构学习 jz29 顺时针打印矩阵

关键词&#xff1a;模拟 题目&#xff1a;螺旋遍历二维数组 简单题做了超过40分钟 调了很久 不好 方法一&#xff1a; 我自己做的。 思路&#xff1a; xy_t&#xff1a; 记录xy的方向&#xff0c;往右走&#xff0c;往下走&#xff0c;往左走&#xff0c;往上走 t控制方…

Jupyter Notebook

2017年左右在大学里都听说过Jupyter Notebook&#xff0c;并且也安装用了一段时间&#xff0c;后来不知道什么原因没有用了。估计是那时候写代码的时候多一些&#xff0c;因为它可以直接写代码并运行结果&#xff0c;现在不怎么写代码了。 介绍 后缀名为.ipynb的json格式文件…

105、Zero-1-to-3: Zero-shot One Image to 3D Object

简介 官网  使用合成数据集来学习相对摄像机视点的控制&#xff0c;这允许在指定的摄像机变换下生成相同对象的新图像&#xff0c;用于从单个图像进行三维重建的任务。 实现流程 输入图像 x ∈ R H W 3 x \in \R^{H \times W \times 3} x∈RHW3&#xff0c;所需视点的相…

PyTorch——torchtext与PyTorch匹配的版本

一、匹配版本的对照表 二、按照对应版本的命令 例子&#xff1a; pip install torchtext0.9.1参考资料&#xff1a; Torchtext and PyTorch s Version Compatibility

云联惠 被查 消费积分合法化!——全新消费返利模式!共享购!

大家好 我是吴军 一家软件开发公司的产品经理 今天讲一讲&#xff0c;曾经盛极一时的云联惠&#xff0c;巅峰时期达到一千万的用户&#xff0c;资金6000亿。 前几年云联惠如火如荼&#xff0c;到处都是在宣传云联惠的&#xff0c;小编也略玩了一下下。 当时因为政策的不明朗…

SpringBoot:详解依赖注入和使用配置文件

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、&#x1f3…

【软件工程】《软件工程》期末复习提纲

《软件工程》期末复习提纲 第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 第九章 第十章 第十一章 第十二章 第十三章 第十四章 小题参考 大题参考 《软件工程》期末复习提纲 第一章 1.在下列选项中&#xff0c;&#xff08; &#xff09;不是软…

10.9.2 std::function 代替函数指针 Page182~183

std::function是一个模板类&#xff0c;基本可作为函数指针的代替品&#xff0c;具备更多功能&#xff0c;特别是与函数对象及bind配合使用。使用std::function时&#xff0c;需要添加头文件 #include <functional> 1.定义函数指针 18行&#xff0c;定义了一个函数指针类…

Linux常用命令大全(三)

系统权限 用户组 1. 创建组groupadd 组名 2. 删除组groupdel 组名 3. 查找系统中的组cat /etc/group | grep -n “组名”说明&#xff1a;系统每个组信息都会被存放在/etc/group的文件中1. 创建用户useradd -g 组名 用户名 2. 设置密码passwd 用户名 3. 查找系统账户说明&am…

多模型图像特征可视化

特征图可视化是指将网络中某一层的特征图可视化出来&#xff0c;以便观察网络在不同层次上学到的特征。卷积可视化可以帮助深度学习研究者更好地理解卷积的概念和原理&#xff0c;从而更好地设计和优化卷积神经网络。通过可视化&#xff0c;研究者可以更清晰地看到卷积运算中的…

【现代密码学】笔记 补充7-- CCA安全与认证加密《introduction to modern cryphtography》

【现代密码学】笔记7-- CCA安全与认证加密《introduction to modern cryphtography》 写在最前面7 CCA安全与认证加密 写在最前面 主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。 内容补充&#xff1a;骆婷老师的PPT 《introduction to modern cryphtography》…

【GitHub项目推荐--一行命令下载全网视频】【转载】

项目地址&#xff1a;https://github.com/soimort/you-get 首先声明&#xff0c;请不要使用该项目从事违法活动哦~仅供学习使用&#xff01; 解决痛点 如果你上网的时候看了一些东西不错&#xff0c;想下载下来&#xff0c;或者在线观看喜欢的视频&#xff0c;但是没有找到网…

坚持刷题|翻转二叉树

坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;今天先刷个简单的&#xff1a;翻转二叉树 题目 226.翻转二叉树 考察点 翻转二叉树又称为镜像二叉树&#xff0c;使用Java实现翻转二叉树通常是为了考察对二叉树的基本操作和递归的理解能力 递归的理解&#xff1a; 能够理解…