C#中假设正确使用线程Task类和Thread类
C#中使用线程Task类和Thread类小结
刚接触C#3个月左右。原先一直使用C++开发。由于公司的须要,所地採用C#开发。主要是控制设备的实时性操作,此为背景。
对于C#中的Task和Thread我在这不作介绍,要了解很多其它的。假设查看相当信息。此次项目中使用到TASK和THRED,让我调试足足用了将近两周的时间才找出问题所在,所以在此写出来防止跟我一样刚接触C#,又同一时候须要对线程的实时性要求的开发者一些个人总结注意事项。
1.Task适合用于多处理器,且i系列多处理器。
2.Thread则适用于全部的处理器,实时性更高。
以下是我的个人測试代码:
当中使用的对错可能是我个人对C#线程理解不够引起的。假设有使用不对错,望大鸟指导。
private static void ThreadAndTaskTest()
{
Stopwatch watch = new Stopwatch();
watch.Start(); <p> //Thread threadTest1 = new Thread(() =>
//{
// Thread.Sleep(2000);
// Debug.WriteLine("线程1结束消耗时间:{0}", watch.ElapsedMilliseconds);
//});
//threadTest1.Start();</p><p> //Thread threadTest2 = new Thread(() =>
//{
// Thread.Sleep(2000);
// Debug.WriteLine("线程2结束消耗时间:{0}", watch.ElapsedMilliseconds);
//});
//threadTest2.Start();</p><p> //Thread threadTest3 = new Thread(() =>
//{
// Thread.Sleep(2900);
// Debug.WriteLine("线程2结束消耗时间:{0}", watch.ElapsedMilliseconds);
//});
//threadTest3.Start();</p><p> </p> var Task1 = Task.Factory.StartNew(() =>
{
Thread.Sleep(2500);
Debug.WriteLine("线程1结束消耗时间:{0}", watch.ElapsedMilliseconds);
}); var Task2 = Task.Factory.StartNew(() =>
{
Thread.Sleep(2700);
Debug.WriteLine("线程2结束消耗时间:{0}", watch.ElapsedMilliseconds);
}); var Task3 = Task.Factory.StartNew(() =>
{
Thread.Sleep(2900);
Debug.WriteLine("线程3结束消耗时间:{0}", watch.ElapsedMilliseconds);
}); while (watch.ElapsedMilliseconds <= 3000)
{
//if (!threadTest.IsAlive && !threadTest1.IsAlive)
if (Task1.IsCompleted && Task2.IsCompleted && Task3.IsCompleted)
{
Debug.WriteLine("监控结束消耗时间:{0}", watch.ElapsedMilliseconds);
break;
}
else
Thread.Sleep(1);
}
}
上面採用Task測试结果例如以下:
线程1结束消耗时间:2503
线程2结束消耗时间:2703
线程3结束消耗时间:3944(理论应该2905)
相同的代码採用Thread的測试结例如以下:
线程2结束消耗时间:2003
线程1结束消耗时间:2002
线程2结束消耗时间:2905
上面測试环境在:
处理器:Pentium(R)Dual-Core CPU E6700 @3.20GHXZ
安装内存(RAM):4.0GB
系统类型:32位操作系统
假设採用 i5系列的CPU,其他硬件环境都一样则不会有这样的超时情况.
在此也遇到点问题:线程20个以上同一时候执行,线程的实时性差异也非常大,同一个线程函数差距有700ms.
C#中假设正确使用线程Task类和Thread类的更多相关文章
- 如何创建线程第一种继承Thread类
步骤 1:定义一个类 继承Thread类.2:重写Thread类的run方法.3:直接创建Thread的子类对象创建线程.4:调用start方法开启线程并调用线程的任务run方法执行.-------- ...
- 【Java中的线程】java.lang.Thread 类分析
进程和线程 联想一下现实生活中的例子--烧开水,烧开水时是不是不需要在旁边守着,交给热水机完成,烧开水这段时间可以去干一点其他的事情,例如将衣服丢到洗衣机中洗衣服.这样开水烧完,衣服洗的也差不多了.这 ...
- JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)
实现线程并发有两种方式:1)继承Thread类:2)实现Runnable接口. 线程基础 1)程序.进程.线程:并行.并发. 2)线程生命周期:创建状态(new一个线程对象).就绪状态(调用该对象的s ...
- Java知多少(58)线程Runnable接口和Thread类详解
大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: 实现Runnable 接口: 可以继承Thread类. 下面的两小节依次介绍了每一种方式. 实现Runnable接口 ...
- Java 线程--继承java.lang.Thread类实现线程
现实生活中的很多事情是同时进行的,Java中为了模拟这种状态,引入了线程机制.先来看线程的基本概念. 线程是指进程中的一个执行场景,也就是执行流程,进程和线程的区别: 1.每个进程是一个应用程序,都有 ...
- 多线程-2.线程创建方式和Thread类
线程的创建方式 1.继承Thread类,重写run方法,示例如下: 1 class PrimeThread extends Thread { 2 long minPrime; 3 PrimeThrea ...
- python端口扫描用多线程+线程安全的队列+Thread类实现
用线程安全的队列Queue实现扫描端口数据存储 用多线程扫描端口 用Thread类实现程序组织 #coding:utf-8 import sys import socket import sys im ...
- Process类,Thread类,Pool类,gevent类,ProcessPoolExecutor,ThreadPoolExecutor的用法比较
一 Process类 multiprocessing模块下的一个类 创建子进程. 有两种方法 方法一 from multiprocessing import Process import os def ...
- communication between threads 线程间通信 Programming Concurrent Activities 程序设计中的并发活动 Ada task 任务 Java thread 线程
Computer Science An Overview _J. Glenn Brookshear _11th Edition activation 激活 parallel processing 并行 ...
随机推荐
- C语言 cgi(3)
1cs3157 – Advanced ProgrammingSummer 2014, Project 1, 150 pointsJune 17, 2014Follow these step-by-st ...
- mysql重装后出现乱码解决办法
查看当前连接系统参数:SHOW VARIABLES LIKE '%char%'; mysql> show variables like 'char%'; +------------------- ...
- 怎样在Android开发中FPS游戏实现的两种方式比较
怎样在Android开发中FPS游戏实现的两种方式比较 如何用Android平台开发FPS游戏,其实现过程有哪些方法,这些方法又有哪些不同的地方呢?首先让我们先了解下什么是FPS 英文名:FPS (F ...
- [Windows Phone] 以多国语言做为开发前提 (2)
原文:[Windows Phone] 以多国语言做为开发前提 (2) ? 前言 在先前的文章 [Windows Phone 开发 - 以多国语言做为开发前提 (1)] 中说明了简单的多国语言范例,今天 ...
- Eclipse工具的问题
1 Eclipse采用ctrl抄 粘贴很卡 Eclipse -- Windows->Preferences->General->Editors->Text Editors-&g ...
- li排序
html <ul id="ul1"> <li>9</li> <li>2</li> <li>7</li& ...
- arch linux设备(请参考官方文档,桌面安装没有找到一个好工作后)
首先,启动安装系统(一获得通过vmware虚拟机) 1.设置键盘布局 #loadkeys "us" #设置为美国的键盘布局.一般能够默认就可以 2.建立硬盘的分区 我採用的是fdi ...
- (转)Maven最佳实践:划分模块
“分天下为三十六郡,郡置守,尉,监” —— <史记·秦始皇本纪> 所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml.它们之间通过继承和聚合(也称作多模块 ...
- Mybatis深入之事务管理
Mybatis之事务管理 简单介绍 Mybatis的事务管理分为两种JdbcTransaction.ManagedTransaction. 当中JdbcTransaction仅仅是对数据库连接Conn ...
- WebAPI通过multipart/form-data方式同时上传文件以及数据(含HttpClient上传Demo)
简单的Demo,用于了解WebAPI如何同时接收文件及数据,同时提供HttpClient模拟如何同时上传文件和数据的Demo,下面是HttpClient上传的Demo界面 1.HttpClient部分 ...