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);
            }
        }
       
    }
}

  

原文地址:https://www.cnblogs.com/gylhaut/p/5793527.html