• async/await 的引用


    static async void Start()
    {
    string s = "ass";
    
    Console.WriteLine(getMemory(s)+"Hello World!" + Thread.CurrentThread.ManagedThreadId);
    
    await AsyncMethod();
    Console.WriteLine(getMemory(s) + "End World!" + Thread.CurrentThread.ManagedThreadId);
    Console.WriteLine();
    }
    static async Task AsyncMethod()
    {
    
    await Task.Run(() =>
    {
    Console.WriteLine("AsyncMethod 执行," + Thread.CurrentThread.ManagedThreadId);
    });
    }

    public static string getMemory(object o) // 获取引用类型的内存地址方法 
    {
      GCHandle h = GCHandle.Alloc(o, GCHandleType.WeakTrackResurrection);

      IntPtr addr = GCHandle.ToIntPtr(h);

      return "0x" + addr.ToString("X");
    }

    红色的变量的 地址在await  两边一样吗?

    是不一样的!

     getMemory 这个方法换个写法就一样了:

     public static string getMemory(object o) // 获取引用类型的内存地址方法 
            {
                GCHandle h = GCHandle.Alloc(o, GCHandleType.Pinned);
    
                IntPtr addr = h.AddrOfPinnedObject();
               
                return "0x" + addr.ToString("X");
            }

     这个值应该是一个的。至少地址是一个。因为引用类型都是在堆上。堆是进程所有的。

    async 和await 是成对出现的。有一个注意的点:async 是方法的修饰符,这个方法的await 之后的是回调。出了这个方法就不是的了。

    在Winform 程序的Buttion_Click() 方法中,使用了这种异步语法,是没问题的,

         private async void button1_Click(object sender, EventArgs e)
            {
                textBox1.Text += "zzz " + Thread.CurrentThread.ManagedThreadId.ToString() + "
    ";
                await Task.Run(() => { Thread.Sleep(2000); });
                button1.Text += "2";
                MessageBox.Show("))))))))))))))))s");
    
                textBox1.Text += "ttt " + Thread.CurrentThread.ManagedThreadId.ToString()+"
    ";
    
            }
    

      

    这个Buttion_Click 上可以写async!   Await 后面的代码,是主线程操作了控件,这是编译器知道这个程序,然后进行了相应的处理。

    async 这种语法,在Web项目中,会增加吞吐量,不会缩短对单个请求的响应时间。

    下面是一个测试:

     1  public static async void Test()
     2         {
     3            var t1= Task.Run(() => {
     4                 Thread.Sleep(2000);
     5                 Console.WriteLine("Sleep over");
     6             });
     7 
     8              t1.Wait();
     9             Console.WriteLine("Sleep over....1");
    10 
    11             var t2 = Task.Run(() => {
    12 
    13                 Thread.Sleep(2000);
    14                 Console.WriteLine("Sleep over 2");
    15             });
    16 
    17             t2.Wait();
    18             Console.WriteLine("Sleep over.....2");
    19         }
    20 
    21         public static  void Main(string[] args)
    22         {
    23             Console.WriteLine("start..");
    24             Test();
    25             Console.WriteLine("over");
    26             Console.ReadLine();
    27         }

    start..
    Sleep over
    Sleep over....1
    Sleep over 2
    Sleep over.....2
    over
    Wait(); 换成 awiat t
    打印如下:

    start..
    over
    Sleep over
    Sleep over....1
    Sleep over 2
    Sleep over.....2

    下面是一个Async 的解析后的治理:

      static async Task Main()
            {
                Console.WriteLine("111111111111111");
                await Task.Run(() => {
                    Console.WriteLine("2222222222222");
                });
                Console.WriteLine("33333");
            }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.CompilerServices;
    using System.Text;
    using System.Threading.Tasks;
    
    public class button1_Click : IAsyncStateMachine
    {
        public int state1;
    
        public AsyncVoidMethodBuilder t__builder;
    
        public object sender;
    
        public EventArgs e;
    
    
    
        private TaskAwaiter taskWaiter;
    
        private void MoveNext()
        {
            int num = state1;
            try
            {
                TaskAwaiter awaiter;
                if (num != 0)
                {
                    Console.WriteLine("111111111111111");
                    awaiter = Task.Run(delegate
                    {
                        Console.WriteLine("2222222222222");
                    }).GetAwaiter();
                    if (!awaiter.IsCompleted)
                    {
                        num = (state1 = 0);
                        taskWaiter = awaiter;
                        button1_Click stateMachine = this;
                        t__builder.AwaitUnsafeOnCompleted(ref awaiter, ref stateMachine);
                        return;
                    }
                }
                else
                {
                    awaiter = taskWaiter;
                    taskWaiter = default(TaskAwaiter);
                    num = (state1 = -1);
                }
                awaiter.GetResult();
                Console.WriteLine("33333");
            }
            catch (Exception exception)
            {
                state1 = -2;
                t__builder.SetException(exception);
                return;
            }
            state1 = -2;
            t__builder.SetResult();
        }
    
        void IAsyncStateMachine.MoveNext()
        {
            //ILSpy generated this explicit interface implementation from .override directive in MoveNext
            this.MoveNext();
        }
    
    
        private void SetStateMachine(IAsyncStateMachine stateMachine)
        {
        }
    
        void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
        {
            //ILSpy generated this explicit interface implementation from .override directive in SetStateMachine
            this.SetStateMachine(stateMachine);
        }
    }
    气功波(18037675651)
  • 相关阅读:
    固态硬盘 每秒1.5G
    editPlus
    juqery 插入一行
    BufferedReader读取UTF8文件中文乱码
    jquery table 操作
    noSql
    javascript 开发规范
    同一服务器上安装多个tomcat
    100 个搜索引擎
    firefox 开发sdk
  • 原文地址:https://www.cnblogs.com/qgbo/p/11468527.html
Copyright © 2020-2023  润新知