同步和异步
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); } } } }