同步执行5次 循环1亿次方法 对比委托异步执行5次 循环1亿次方法
private void Test(string name)
{
Console.WriteLine($"---------------{name}--------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}----------------------");
int j = 0;
for (int i = 0; i < 1_000_000_000; i++)
{
j++;
}
}
1、同步方法:
/// <summary>
/// 同步
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
Console.WriteLine($"----------------同步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------开始-----------");
for (int i = 0; i < 5; i++)
{
this.Test(string.Format($"Test_{i}"));
}
Console.WriteLine($"----------------同步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------结束-----------");
}
2、异步方法:
/// <summary>
/// 异步多线程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
Console.WriteLine("------------------------------------");
Console.WriteLine($"----------------异步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------开始-----------");
Action<string> action = this.Test;
for (int i = 0; i < 5; i++)
{
string name = string.Format($"Test_{i}");
action.BeginInvoke(name, null, null);
}
Console.WriteLine($"----------------异步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------结束-----------");
}
1&2执行结果:
3、异步完成调用后调用方法:AsyncCallback
/// <summary>
/// 异步
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
Console.WriteLine("------------------------------------");
Console.WriteLine($"----------------异步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------开始-----------");
Action<string> action = this.Test;
AsyncCallback callback = ar => Console.WriteLine("完成计算");
string name = string.Format($"Test_1");
action.BeginInvoke(name, callback, null);
Console.WriteLine($"----------------异步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------结束-----------");
}
3结果
4、异步回调
/// <summary>
/// 异步回调
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
Console.WriteLine("------------------------------------");
Console.WriteLine($"----------------异步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------开始-----------");
Action<string> action = this.Test;
AsyncCallback callback = ar =>
{
Console.WriteLine($"计算完成。{ar.AsyncState}---{Thread.CurrentThread.ManagedThreadId.ToString()}");
};
string name = string.Format($"Test_1");
action.BeginInvoke(name, callback, "回去");
Console.WriteLine($"----------------异步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------结束-----------");
}
4结果:
5、判断异步是否完成 IsCompleted
/// <summary>
/// 异步回调
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
Console.WriteLine("------------------------------------");
Console.WriteLine($"----------------异步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------开始-----------");
Action<string> action = this.Test;
IAsyncResult asyncResult = null;
// asyncResult.AsyncWaitHandle.WaitOne();//等到任务完成
AsyncCallback callback = ar =>
{
Console.WriteLine($"计算完成。{ar.AsyncState}---{Thread.CurrentThread.ManagedThreadId.ToString()}");
};
string name = string.Format($"Test_1");
asyncResult=action.BeginInvoke(name, callback, "回去");
int i = 0;
while (!asyncResult.IsCompleted)
{
if (i < 9) {
Console.WriteLine($"已完成{++i*10}%.....");
}
else
{
Console.WriteLine($"已完成99.999999%.....");
}
Thread.Sleep(200);
}
Console.WriteLine("全部完成");
Console.WriteLine($"----------------异步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------结束-----------");
}
5结果: