通过委托的方式创建线程
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(加锁的对象);
新闻热点
疑难解答