zoukankan      html  css  js  c++  java
  • 异步

    await不会阻塞主线程(UI不会假死,IIS回收空闲线程),会把后面的操作封装成callback

    Result会阻塞线程

    async/await(Task) //await后不会开启新的线程,只有async里用Task.Run或Task.Factory.Startnew开启新线程后,await时才会等待线程,不加await时异步执行, await只能等待Task

    static void Main(string[] args)
    {
        Console.WriteLine("Main Thread Id: {0}
    ", Thread.CurrentThread.ManagedThreadId);
        Test();
        Console.ReadLine();
    }
     
    static async Task Test()
    {
        Console.WriteLine("Before calling GetName, Thread Id: {0}
    ", Thread.CurrentThread.ManagedThreadId);
        var name = GetName();   //我们这里没有用 await,所以下面的代码可以继续执行
        // 但是如果上面是 await GetName(),下面的代码就不会立即执行,输出结果就不一样了。
        Console.WriteLine("End calling GetName.
    ");
        Console.WriteLine("Get result from GetName: {0}", await name);
    }
     
    static async Task<string> GetName()
    {
        // 这里还是主线程
        Console.WriteLine("Before calling Task.Run, current thread Id is: {0}", Thread.CurrentThread.ManagedThreadId);
        return await Task.Run(() =>
        {
            Thread.Sleep(1000);
            Console.WriteLine("'GetName' Thread Id: {0}", Thread.CurrentThread.ManagedThreadId);
            return "Jesse";
        });
    }

    HttpClient

    client.GetAsync("http://google.com").Result

    await client.GetAsync("http://google.com")

    response.Content.ReadAsAsync().Result

    await response.Content.ReadAsAsync()

    Task<HttpResponseMessage> responseTask= httpClient.GetAsync(“http://en.wikipedia.org/”); //创建Task并执行

    HttpResponseMessage response = await responseTask; //等待task执行完毕

    //并发
            public async Task Await3Task()
            {
                var task3 = Delay3000Async();
                var task2 = Delay2000Async();
                var task1 = Delay1000Async();
    
                await task3;
                await task2;
                await task1;
            }
    
            //非并发
            public async Task Await3DelayAsync()
            {
                await Delay3000Async();
                await Delay2000Async();
                await Delay1000Async();
            }
    
            //并发,这里甚至可以把var task3等去掉,直接调用xxxAsync(),只是会出现警告的波浪罢了
            public void NoAwait3Task()
            {
                var task3 = Delay3000Async();
                var task2 = Delay2000Async();
                var task1 = Delay1000Async();
            }
    

      

    线程间通信
    winform invode
    wpf dispacher
    asp.net SynchronizationContext(将任务(delegate)以队列的方式放入context中,再把context关联到
    具体线程上,多个线程可关联相同的SynchronizationContext,SynchronizationContext.Current获取
    当前线程关联的上下文)

    url:http://www.cnblogs.com/jesse2013/p/Asynchronous-Programming-In-DotNet.html

    url:http://www.cnblogs.com/richieyang/p/5020849.html

  • 相关阅读:
    UI、JS框架----Bootstrap、Metro
    重构—改善既有代码的设计4——构筑测试体系
    重构—改善既有代码的设计3——代码的坏味道
    正则匹配-URL-域名
    pgAdmin的数据恢复
    重构—改善既有代码的设计2
    重构—改善既有代码的设计1
    Levenshtein Distance,判断字符串的相似性
    最大匹配字符串LCS,The Longest Common Substring
    email
  • 原文地址:https://www.cnblogs.com/yfann/p/4716482.html
Copyright © 2011-2022 走看看