关于关于C#委托三种调用的分享使用委托三种调用的分享使用
一、同步调用一、同步调用
1、同步调用会按照代码顺序来执行
2、同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体
验,这时候异步调用就很有必要了。
举个栗子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading;
namespace Test
{
public delegate int AddHandler(int a, int b);
public class Calc
{
public static int Add(int a, int b)
{
Console.WriteLine("开始计算:" + a + "+" + b);
Thread.Sleep(3000); //模拟该方法运行三秒
Console.WriteLine("计算完成!");
return a + b;
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("===== 同步调用 SyncInvokeTest =====");
AddHandler handler = new AddHandler(Calc.Add);
int result = handler.Invoke(1, 2);
Console.WriteLine("继续做别的事情。。。");
Console.WriteLine(result);
Console.ReadKey();
}
}
}
* 问:为什么Invoke的参数和返回值和AddHandler委托是一样的呢?
* 答:Invoke方法的参数很简单,一个委托,一个参数表(可选),
而Invoke方法的主要功能就是帮助你在UI线程上调用委托所指定的方法。
Invoke方法首先检查发出调用的线程(即当前线程)是不是UI线程,
如果是,直接执行委托指向的方法,如果不是,它将切换到UI线程,
然后执行委托指向的方法。不管当前线程是不是UI线程,
Invoke都阻塞直到委托指向的方法执行完毕,然后切换回发出调用的
线程(如果需要的话),返回。
所以Invoke方法的参数和返回值和调用他的委托应该是一致的。