C#中线程的用法
2015-12-26 12:06
471 查看
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(加锁的对象);
{
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# 表复制和数据行的复制说明(Clone、ImportRow 、Copy )
- c# 串口所有数据接收 到串口的数据全部处理
- C#索引器
- C#学习之类的构造方法
- c# 串口调试
- 生成随机密码
- C# Socket编程笔记
- c#widowform导出数据模块编写
- C#流概述
- C#回调实现的一般过程
- C# 流总结(Stream)
- C# 新建文本文件
- C# 文件的读取、写入和删除
- C# 控制台程序实现 Ctrl + V 粘贴功能
- 新手C#协变和抗变学习总结
- C# 所谓的跨类跨线程访问控件
- C#判断文件及文件夹是否存在并创建(C#判断文件夹存在)
- C#学习笔记 线程操作
- [原]C#:读取数据DataReader
- C# 实现播放RTSP 标准协议码流播放