C#根蒂根基:线程之异步回调(委托)
名人名言:智慧的可靠标志就是能够在平凡中发现奇迹。——爱默生
异步回调,什么是异步回调?我是如许懂得的,当主线程在履行一段代码的时辰,我们用委托履行了一个线程,这个线程要返回一个成果,关键是什么时辰返回这个成果,异步回调就是在这个线程履行完成后立即返回这个线程的成果,然后持续履行主线程的办法。
在评论辩论异步回调之前我们先依次来评论辩论一下同步履行和异步履行,最后来评论辩论异步回调。
一、同步履行
同步履行:在主线程履行的时辰,主线程调用一个其它办法,此时主线程梗阻,守候调用办法履行完成后主线程才干持续履行。
下面是同步履行的流程图

接下来看看代码中的同步履行
static void Main(string[] args)
{
#region 同步履行
for (int i = 0; i < 100; i++)
{
if (i == 50)
{
Console.Write("调用办法TakeAWhile并守候办法履行完成。");
TakeAWhile(1, 3000);
Console.Write("办法TakeAWhile履行完成。。。");
}
Thread.Sleep(30);
Console.Write(".");
}
#endregion
}
static int TakeAWhile(int data, int ms)
{
Thread.Sleep(ms);
return ++data;
}
二、异步履行:
异步履行:在主线程在履行的时辰,打开一个子线程,主线程持续履行,当主线程须要子线程运行的成果的时辰,主线程直接调用子线程运行成果,若是在调用的时辰子线程还没有履行完成,主线程守候,直到子线程履行完成,主线程再持续履行。
下面是异步履行的流程图

接下来我们看看代码中的异步履行
static void Main(string[] args)
{
#region 异步履行
Func<int, int, int> d2 = TakeAWhile;
IAsyncResult ar = d2.BeginInvoke(1, 3000, null, null);
while (!ar.IsCompleted)
{
Console.Write(".");
Thread.Sleep(50);
}
int result = d2.EndInvoke(ar);
Console.Write("result:{0}",result);
#endregion
}
static int TakeAWhile(int data, int ms)
{
Console.Write("TakesAWhile started");
Thread.Sleep(ms);
Console.WriteLine("TakeAWhile Completed");
return ++data;
}
三、异步回调
异步回调:主线程在履行的时辰,打开一个子线程,主线程持续履行,当子线程履行完成的时辰,主线程立即输出主线程的运行成果,主线程持续履行。
下面是异步回调履行的流程图

接下来我们看看代码中的异步回调
static void Main(string[] args)
{
#region 异步回调
Func<int, int, int> dl = TakeAWhile;
dl.BeginInvoke(1, 3000, TakesAWhileCompleted, dl);
for (int i = 0; i < 100; i++)
{
Console.Write(".");
Thread.Sleep(50);
}
#endregion
}
static int TakeAWhile(int data, int ms)
{
Console.Write("TakesAWhile started");
Thread.Sleep(ms);
Console.WriteLine("TakeAWhile Completed");
return ++data;
}
static void TakesAWhileCompleted(IAsyncResult ar)
{
if (ar == null)
throw new ArgumentNullException("ar");
Func<int, int, int> dl = (Func<int, int, int>)ar.AsyncState;
int result = dl.EndInvoke(ar);
Console.WriteLine("Result:{0}",result);
}
申明:流程图是经由过程本身的懂得画的,若是不合错误的处所,感谢指出,一路商量一路进修。
同时,迎接拍砖!!!
![]()
智慧的可靠标志就是能够在平凡中发现奇迹。——爱默生
浙公网安备 33010602011771号