using System;
using System.Diagnostics;
using System.Threading;
/// <summary>
/// 异步委托练习
/// </summary>
namespace AsyTest
{
delegate void DoSomethingHandler(string msg);
class Program
{
static long totalTimes = 0;
static void Main(string[] args)
{
Console.WriteLine("==============任务Start。当前主线程 ID {0}===============",Thread.CurrentThread.ManagedThreadId);
Stopwatch globalWatch = new Stopwatch();
globalWatch.Start();
DoSomethingHandler method = DoSomething;
method("同步执行");
string msg = string.Format("异步执行");
IAsyncResult result = method.BeginInvoke(msg, Callback, string.Format("这是主线程ID {0}传给Callback的参数",Thread.CurrentThread.ManagedThreadId));
//异步线程的同步方法
//1.EndInvoke放在同线程的任何地方
//method.EndInvoke(result);
//2.IsCompleted
//while(!result.IsCompleted)
//{
//}
//3.等待异步完成的信号
//result.AsyncWaitHandle.WaitOne();
globalWatch.Stop();
Console.WriteLine("主线程耗时={0} ms", globalWatch.ElapsedMilliseconds);
Console.WriteLine("==============任务End。当前主线程 ID {0}===============", Thread.CurrentThread.ManagedThreadId);
Console.ReadKey();
long globalTimes = globalWatch.ElapsedMilliseconds;
Console.WriteLine("各线程总耗时 {0} ms,相比异步线程多耗时{1}%",totalTimes, ((totalTimes- globalTimes) / (float)totalTimes) * 100);
}
static void DoSomething(string msg)
{
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 10; i++)
{
Thread.Sleep(100);
Console.WriteLine("编号{0}接受到的信息 {1},当前线程={2}",i,msg,Thread.CurrentThread.ManagedThreadId);
}
watch.Stop();
Console.WriteLine("DoSomething耗时={0} ms", watch.ElapsedMilliseconds);
totalTimes += watch.ElapsedMilliseconds;
}
static void Callback(IAsyncResult ia)
{
Console.WriteLine("异步执行完毕,回调函数执行Start,当前线程ID={0}", Thread.CurrentThread.ManagedThreadId);
Stopwatch watch = new Stopwatch();
watch.Start();
string getMainMsg = (string)ia.AsyncState;//数据卸包
int i = 0;
while ( i < 5)
{
Console.WriteLine("执行回调任务{0},{1}",i, getMainMsg);
Thread.Sleep(10);
i++;
}
watch.Stop();
Console.WriteLine("回调函数执行任务耗时={0} ms", watch.ElapsedMilliseconds);
Console.WriteLine("异步执行完毕,回调函数执行End,当前线程ID={0}", Thread.CurrentThread.ManagedThreadId);
totalTimes += watch.ElapsedMilliseconds;
}
}
}