C#中线程的用法
通过委托的方式创建线程
static int sum(int x)
{
return x+x;
{
Func<int> a = sum;
创建一个新的线程格式:a.BeginInvoke(10);
获取一个线程的返回值:IAsyncResult ar = a.BeginInvoke(10,null,null);
//第二种方法 IAsyncResult ar = a.BeginInvoke(10,OnCallback,a);
//第三种方法,使用lanmba表达式,例如:
/* IAsyncResult ar = */ a.BeginInvoke(10,ar=>
{
int res = a.EndInvoke(ar);
Console.WriteLine(res);
},null)
第一个null参数代表回调函数,例如:
static void OnCallback(IAsyncResult ar)
{
第二个null参数是回调函数传递的数据,例如:
Func<int> a = ar.AsyncState as Func<int>; // 把ar.AsyncState类型转换为Func<int>类型的对象
}
获取线程返回值的状态:ar.IsCompleted的返回值true为线程结束,false为线程还未结束。
获取线程的执行的结果:int res = a.EndInvoke(ar);
用Thread创建线程
创建线程:Thread t = new Thread(Function); // Function为需要启动一个新的线程来执行的函数
启动线程:t.Start(); // 如果Function有参数(必须是Object类型),则Function的参数由Start函数来传递
获取线程ID:Thread.CurrentThread.ManagedThreadId
也可以自己写一个类,例如:
class MyThread
{
private string fileName;
private string filePath;
public MyThread(string filename,string filepath)
{
this.fileName = filename;
this.filePath = filepath;
}
public void DownFile(string filename,string filepath)
{
Console.WriteLine("正在下载:"+filepath+filename);
......
Console.WriteLine("下载完成");
}
}
在program中调用
MyThread myt = new MyThread("filename","filepath");
Thread t = new Thread(myt.Down);
t.Start();
设置后台线程的方法,例如:t.IsBackground = true;
线程分为前台线程与后台线程,后台线程会伴随着前台线程的结束而被强制结束
强制终止一个线程:t.Abort();
优先执行的线程:t.Join(); // 暂停当前程序,先执行t.Join()然后再执行当前未执行完的线程
C#中的线程池
C#中已经封装好了一个线程池ThreadPool,在双核的条件下默认1023个工作线程,和1000个I/O线程。所有线程为后台线程
调用线程池的方法:ThreadPool.QueueUserWorkItem(Function); // Function为自定义函数,这个函数要有一个object类型的一个参数
像一个正在运行的线程加锁的用法:lock(加锁的对象);
C#中线程的用法的更多相关文章
- mysql中event的用法详解
一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...
- python中threading的用法
摘自:http://blog.chinaunix.net/uid-27571599-id-3484048.html 以及:http://blog.chinaunix.net/uid-11131943- ...
- 四种Java线程池用法解析
本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...
- C#线程池用法
C#线程池用法 在C#编程语言中,使用线程池可以并行地处理工作,当强制线程和更新进度条时,会使用内建架构的ThreadPool类,为批处理使用多核结构,这里我们来看在C#编程语言中一些关于来自Syst ...
- 【java】之常用四大线程池用法以及ThreadPoolExecutor详解
为什么用线程池? 1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处-理效率2.线程并发数量过多,抢占系统资源从而导致阻塞3.对线程进行一些简单的管理 在Java中,线程池 ...
- Java 中 synchronized的用法详解(四种用法)
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码.本文给大家介绍java中 synchronized的用法,对本文感兴趣的朋友一起看看吧 ...
- Java中线程池,你真的会用吗?
在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Executors静态工厂构建线程池,但一般不建 ...
- java中线程池的几种实现方式
1.线程池简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建 ...
- java成神之——java中string的用法
java中String的用法 String基本用法 String分割 String拼接 String截取 String换行符和format格式化 String反转字符串和去除空白字符 String获取 ...
随机推荐
- Fatal error: Call to undefined function mysql_connect()
我在进行PHP环境搭建:Windows 7下安装配置PHP+Mysql+apache环境时,之前都没有什么问题,只是在验证PHP是否能连接Mysql时出现如下错误:Fatal error: Call ...
- virtualization-vs-containerization
http://containerz.blogspot.com/2015/03/virtualization-vs-containerization.html Virtualization vs. Co ...
- Hadoop卸载或增加节点
卸载节点或者增加节点: 方式一:静态的增添删除:将集群关闭,修改配置文件(etc/hadoop/slaves),重新启动集群(很黄很暴力,不够人性化). 方式二:动态的增加和卸载节点. 卸载DataN ...
- verilog 数组参数
verilog 支持定义数组参数,这样工程很大时,例化模块时可以使代码更简洁:详见实例 module dma_controller #( parameter integer C0_MAX_MIG_BL ...
- JS实现跳转到页面任何地方
要实现两个内容: 1.从A页面跳转到B页面任何地方 方法:用id对要跳转的地方进行标记. 首先,在A页面可以设一个链接 <a href = "b.html#pos" targ ...
- 关于使用用友华表Cell控件按需打印行的方法
分享下只需一个cll文件按需打印行的觉得最好的方式:1.cell文件要打印行的地方最好不要全删了,留一行,设置好单元格样式(字体.对齐方式.折行自适应等),后面会省一些代码: 2.使用CopyRang ...
- JavaSE生成随机数
今天呢,老师讲了一下怎么用jvm实现随机数(本人对此很感兴趣),一个简单的随机100以内整数的代码如下: /** 生成随机数 */ import java.util.Random; public cl ...
- select random item with weight 根据权重随机选出
http://eli.thegreenplace.net/2010/01/22/weighted-random-generation-in-python/ 类似俄罗斯轮盘赌
- initialize 和init
initialize 是类方法,创建实例时会调用该方法.但是只会调用一次.如一个类创建了10个对象,initialize方法只会调用一次,但是init会调用10次.init 是实例方法,每次创建一个实 ...
- angularJS--神奇的$scope
我们在使用angularJS时,$scope对于angularJS是非常重要的,它是angularJS的基础,但$scope到底是什么呢?下面进行一些介绍. 1.$scope是一个普通的js对象 2. ...