Func<int, int,int > a = (d, b) => d+b;
IAsyncResult ar = a.BeginInvoke(3, 4,null, null);
WaitHandle handle = ar.AsyncWaitHandle;
bool res = handle.WaitOne(10); //等待10s获得,如果获得响应,返回true否则false 注意他会阻塞当前线程
if (res==true)
{
int r = a.EndInvoke(ar);
Console.WriteLine(r);
}
利用回调函数(最优)
static void Main(string[] args)
{
Func<int, int,int > a = (d, b) => d+b;
a.BeginInvoke(3, 4, CallBack, a);
Console.ReadKey();
}
static void CallBack(IAsyncResult ar) //系统会自动将该参数填充
{
Func<int, int, int> b = ar.AsyncState as Func<int, int, int>;
int res = b.EndInvoke(ar);
Console.WriteLine("最后得到的结果是:"+ res);
}
利用Thread类直接开启线程
位于System.Threading下面
可以直接new出来一个线程实例,将方法作为构造器参数
然后 实例.Start() 才开启线程
Thread t = new Thread(methodName);
t.Start();
传递参数
第一种方法
可以在函数里面设定一个object类型的参数
然后在Start方法里面传递
void DoSm(Object str){ Console.WriteLine("输入的数据:"+str); }
Thread t = new Thread(DoSm);
t.Start("我很好")
第二种方法
可以定义一个类,类里面包含相应字段成员,然后实例化一个对象,再将对象的方法传递给线程
class Say
{
private string name;
private int age;
public void Say(string name, int age)
{
this.name = name;
this.age = age;
}
public void SayIt()
{
Console.WriteLine("我的名字是:"+name+" "+"年龄为:"+age);
}
}
Class Program
{
static void main(string[] args)
{
Say say = new Say("chaodan", 20);
//创建线程
Thread t = new Thread(say.SayIt);
t.Start();
}
}
或者通过Lambda表达式,其参数可以访问上下文的变量
string name = "job";
Thread t = new Thread( ()=>Console.WriteLine(name) );
t.Start()