zoukankan      html  css  js  c++  java
  • 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);
                }
            }
           
        }
    }
    

      

  • 相关阅读:
    Mac下搭建php开发环境
    phalcon:跟踪sql语句
    phalcon的CLI应用
    phalcon遇到的那些坑
    浏览器 批量大文件上传下载
    网页 批量大文件上传下载
    B/S 批量大文件上传下载
    JavaScript 批量大文件上传下载
    js 批量大文件上传下载
    vue 批量大文件上传下载
  • 原文地址:https://www.cnblogs.com/gylhaut/p/5793527.html
Copyright © 2011-2022 走看看