Net中异步
同步和异步
1.同步是指只启动一个线程
2.异步是指同时启动多个线程
3.同步方法会卡界面,异步方法不会卡界面
原因:异步方法启动了子线程执行任务,主线程得到释放
4.同步方法会慢。异步方法会快
原因:异步启动了.多个线程执行任务,占用了更多的资源
5 异步是无序的,原因:线程的启动和执行是由操作系统决定的,是无序的。
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private delegate void DoSomethingHandler(string name); private void Async_Click(object sender, RoutedEventArgs e) { DoSomethingHandler method = t => Console.WriteLine("这里是Async_Click,name={0},当前线程ID={1}", t,Thread.CurrentThread.ManagedThreadId); method("直接调用"); method.Invoke("Invoke"); method.BeginInvoke("BeginInvoke", null, null);//这就是异步调用 } }
private void DoSomething(string name) { Stopwatch watch = new Stopwatch(); watch.Start(); Console.WriteLine("这里是Async_Click,name={0},当前线程ID={1}", name, Thread.CurrentThread.ManagedThreadId); long lResult = 0; for (int i=0;i<10000000;i++) { lResult += i; } Thread.Sleep(1000); watch.Stop(); Console.WriteLine("这里是Async_Click,name={0},当前线程ID={1},计算结果是{2},耗时{3}", name, Thread.CurrentThread.ManagedThreadId, lResult, watch.ElapsedMilliseconds); }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Threading;
using System.Diagnostics;
namespace MyAsyncDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private delegate void DoSomethingHandler(string name);
private void Async_Click(object sender, RoutedEventArgs e)
{
//DoSomethingHandler method = t =>
// Console.WriteLine("这里是Async_Click,name={0},当前线程ID={1}", t,Thread.CurrentThread.ManagedThreadId);
//method("直接调用");
//method.Invoke("Invoke");
//for (int i = 0; i < 5; i++)
//{
Console.WriteLine("**********************这里是Async_Click***************");
string name = string.Format("Async_Click_{0}", 1);
// DoSomethingHandler method = DoSomething;
Func<string,long> method = GetSomething;
AsyncCallback callback = t => Console.WriteLine("这里是AsyncCallback,当前线程ID={0},AsyncState={1}", Thread.CurrentThread.ManagedThreadId, t.AsyncState);
IAsyncResult result = method.BeginInvoke(name, callback, "Eleven");//这就是异步调用
//1. 一直等到结束,和同步的效果一样
//result.AsyncWaitHandle.WaitOne(-1);
//2.等待异步线程结束的第二种方式
//while (!result.IsCompleted)
//{
// Thread.Sleep(100);
// Console.WriteLine("异步还没有结束,请继续等待");
//}
/3.常用的第三种方式
long lResult = method.EndInvoke(result);
Console.WriteLine("结果是{0}", lResult);
// }
Console.WriteLine("**********************这里是Async_Click***************");
}
private long GetSomething(string name)
{
Stopwatch watch = new Stopwatch();
watch.Start();
Console.WriteLine("这里是GetSomething,name={0},当前线程ID={1}",
name, Thread.CurrentThread.ManagedThreadId);
long lResult = 0;
for (int i = 0; i < 10000000; i++)
{
lResult += i;
}
Thread.Sleep(1000);
watch.Stop();
Console.WriteLine("这里是GetSomething,name={0},当前线程ID={1},计算结果是{2},耗时{3}",
name, Thread.CurrentThread.ManagedThreadId, lResult, watch.ElapsedMilliseconds);
return lResult;
}
private void DoSomething(string name)
{
Stopwatch watch = new Stopwatch();
watch.Start();
Console.WriteLine("这里是Async_Click,name={0},当前线程ID={1}",
name, Thread.CurrentThread.ManagedThreadId);
long lResult = 0;
for (int i=0;i<10000000;i++)
{
lResult += i;
}
Thread.Sleep(1000);
watch.Stop();
Console.WriteLine("这里是Async_Click,name={0},当前线程ID={1},计算结果是{2},耗时{3}",
name, Thread.CurrentThread.ManagedThreadId, lResult, watch.ElapsedMilliseconds);
}
private void Sync_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 5;i++ )
{
string name = string.Format("Sync_Click_{0}", i);
DoSomething(name);
}
}
}
}

浙公网安备 33010602011771号