异步委托:
namespace 异步委托
{
public delegate int MathDelegate(int numb1,int numb2);
class Program
{
static void Main(string[] args)
{
/*
所谓异步执行委托,就是单独开启一个线程来执行委托指向的方法,(最好是自己定义的委托)因为委托放到一个单独的线程中执行,所以主线程没有办法拿到起返回值。有两种方法可以解决
*1)在主线程中阻塞执行,直到子线程中的委托执行完毕返回数据为止,在此之前,主线程后面的代码都被阻塞了,不会执行。
*2)使用回调函数,当子线程中的委托执行完毕之后,会调用这个函数,在这个函数中可以获取到委托的返回值,这种方式不会阻塞主线程的执行,主线程在子线程中的委托执行时可以继续做别的工作。
*/
#region 同步委托:执行委托的线程和主线程是一个线程,委托中的方法没有执行完毕,则后面的代码不会执行。
//MathDelegate mathdel = Sum;
//int result= mathdel(1, 2);
//Console.WriteLine(result);
//Console.WriteLine("这是主线程的id:{0}", Thread.CurrentThread.ManagedThreadId);
#endregion
#region 执行异步委托
#region 使用线程阻塞
//MathDelegate mathdel = Sum;
开辟一个新的线程来执行委托mathdel
result变量就是在主线程指向在子线程中执行的mathdel委托的一个指针
//IAsyncResult result = mathdel.BeginInvoke(1, 2, null, null);
阻塞当前(主)线程的执行,直到委托返回数据为止,才会执行后面的方法。
//int numb = mathdel.EndInvoke(result);
//Console.WriteLine("不要当我,我是不可战胜的");
//Console.WriteLine(numb);
//Console.WriteLine(result);
//Console.WriteLine("这是主线程的id:{0}", Thread.CurrentThread.ManagedThreadId);
#endregion
#region 回调函数
MathDelegate mathdel = Sum;
//开辟一个新的线程来执行委托mathdel
//result变量就是在主线程指向在子线程中执行的mathdel委托的一个指针
IAsyncResult result = mathdel.BeginInvoke(1, 2, new AsyncCallback(CallBackFun), 2);
//阻塞当前(主)线程的执行,直到委托返回数据为止,才会执行后面的方法。
//int numb = mathdel.EndInvoke(result);
Console.WriteLine("不要当我,我是不可战胜的");
Console.WriteLine("这是主线程的id:{0}", Thread.CurrentThread.ManagedThreadId);
#endregion
#endregion
Console.ReadKey();
}
static void CallBackFun(IAsyncResult result)
{
//result在当前线程中执行的委托,以及委托的状态等。
AsyncResult aresult = result as AsyncResult;
MathDelegate del = aresult.AsyncDelegate as MathDelegate;
int numb= del.EndInvoke(aresult);
Console.WriteLine("执行的结果为{0}",numb);
}
#region 同步委托用到的方法
//static int Sum(int numb1, int numb2)
//{
// Console.WriteLine("执行sum方法的线程的id为{0}", Thread.CurrentThread.ManagedThreadId);
// int count = 0;
// while (true)
// {
// count++;
// if (count==1000000000)
// {
// break;
// }
// }
// return numb1 + numb2;
//}
#endregion
#region 异步委托用到的方法
static int Sum(int numb1, int numb2)
{
Console.WriteLine("执行sum方法的线程的id为{0}", Thread.CurrentThread.ManagedThreadId); int count = 0;
while (true)
{
count++;
if (count == 1000000000)
{
break;
}
}
return numb1 + numb2;
}
#endregion
}
}
线程池:
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(string.Format("主线程的id{0}",Thread.CurrentThread.ManagedThreadId));
ThreadPool.QueueUserWorkItem(new WaitCallback(SetLabel),5);
// this.label1.Text = "222";
}
private void SetLabel(object obj)
{
this.label1.BeginInvoke(new Action(delegate()
{
for (int i = 0; i < 100; i++)
{
this.label1.Text = obj.ToString();
Thread.Sleep(50);
}
MessageBox.Show(string.Format("子线程的id{0}", Thread.CurrentThread.ManagedThreadId));
}));
}