.NET处理异步函数调用,事实上是通过线程来完成的。
这个过程有以下几个特点:
1.异步函数由线程完成,这个线程是.NET线程池中的线程2.通常情况下,.NET线程池拥有500个线程(当然这个数量可以设置),每当调用BeginInvoke开始异步处理时,异步处理函数就由线程池中的某个线程负责执行,而用户无法控制具体是由哪个线程负责执行
3.由于线程池中线程数量有限,因此当池中线程被完全占用时,新的调用请求将使函数不得不等待空余线程的出现。此时,程序的效率会有所影响。
为了验证这些特点,请看下面的程序:
class Program
{
delegate void MethodInvoker();
static void Foo()
{
int intAvailableThreads, intAvailableIoAsynThreds;
ThreadPool.GetAvailableThreads(out intAvailableThreads, out intAvailableIoAsynThreds);
string strMessage = String.Format(@"Is Thread Pool: {0},
Thread Id: {1} Free Threads {2}",
Thread.CurrentThread.IsThreadPoolThread.ToString(),
Thread.CurrentThread.GetHashCode(), intAvailableThreads);
Console.WriteLine(strMessage);
Thread.Sleep(10000);
return;
}
static void CallFoo()
{
MethodInvoker simpleDelegate = new MethodInvoker(Foo);
for (int i = 0; i < 15; i++)
{
simpleDelegate.BeginInvoke(null, null);
}
}
static void Main(string[] args)
{
ThreadPool.SetMaxThreads(10, 10);
CallFoo();
Console.ReadLine();
}
}
这个程序在起始的时候将线程池中最大线程个数设置为10个,然后做15次异步调用,每个异步调用中都停留10秒钟当作处理本身所要消耗的时间。从程序的执行我们可以看到,当前10个异步调用完全开始以后,新的异步调用就会等待(注意:不是主线程在等待),直到线程池中有线程空闲出来。
希望本文所述对大家的C#程序设计有所帮助。