zoukankan      html  css  js  c++  java
  • async 和 await 例子

    /// <summary>

    /// C# 5.0

    /// .net framework4.5

    /// CLR4.0

    /// 引入了async 和 await。这两个关键字可以让你更方便的写出异步代码。以前是委托 BeginInvoke ()

    /// async/await是依附于Task的异步,

    /// 只有async方法认为是同步的,只是返回结果类型是

    /// await一定存在于async方法里面 只有async没有await的话是同步方法

    /// 返回的结果是Task<T>,其中T为最终结果

    /// await关键字只能放在Task前面

    ---------------------------------------------------------------

    /// <summary>

    /// 只有async没有await,会有个warn

    /// 跟普通方法没有区别

    /// </summary>

    private static async void NoReturnNoAwait()

    {

    //主线程执行

    Console.WriteLine("NoReturnNoAwait Sleep before Task,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

    Task task = Task.Run(() =>//启动新线程完成任务

    {

    Console.WriteLine("NoReturnNoAwait Sleep before,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

    Thread.Sleep(3000);

    Console.WriteLine("NoReturnNoAwait Sleep after,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

    });

    //主线程执行

    Console.WriteLine("NoReturnNoAwait Sleep after Task,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

    }

    -------------------------------------------------------------------------------------------

    /// <summary>

    /// async/await

    /// await 要放在task前面

    /// 不推荐void返回值,使用Task来代替

    /// Task和Task<T>能够使用await, Task.WhenAny, Task.WhenAll等方式组合使用。Async Void 不行

    /// </summary>

    private static async void NoReturn()

    {

    //主线程执行

    Console.WriteLine("NoReturn Sleep before await,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

    TaskFactory taskFactory = new TaskFactory();

    Task task = taskFactory.StartNew(() =>

    {

    Console.WriteLine("NoReturn Sleep before,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

    Thread.Sleep(3000);

    Console.WriteLine("NoReturn Sleep after,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

    });

    await task;

    //子线程执行 其实是封装成委托,在task之后成为回调(编译器功能 状态机实现)

    Console.WriteLine("NoReturn Sleep after await,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);//这个不由主线程执行

    }

    /// <summary>

    /// 无返回值 async Task == async void

    /// Task和Task<T>能够使用await, Task.WhenAny, Task.WhenAll等方式组合使用。Async Void 不行

    /// </summary>

    /// <returns></returns>

    private static async Task NoReturnTask()

    {

    //这里还是主线程的id

    Console.WriteLine("NoReturnTask Sleep before await,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

    Task task = Task.Run(() =>

    {

    Console.WriteLine("NoReturnTask Sleep before,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

    Thread.Sleep(3000);

    Console.WriteLine("NoReturnTask Sleep after,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

    });

    await task;

    Console.WriteLine("NoReturnTask Sleep after await,ThreadId={0}", Thread.CurrentThread.ManagedThreadId);

    //return new TaskFactory().StartNew(() => { }); 不能return

    }

    /// <summary>

    /// 带返回值的Task

    /// 要使用返回值就一定要等子线程计算完毕

    /// </summary>

    /// <returns>async 就只返回long</returns>

    private static async Task<long> SumAsync()

    {

    Console.WriteLine("SumAsync {1} start ManagedThreadId={0}", Thread.CurrentThread.ManagedThreadId, 111);

    long result = 0;

    await Task.Run(() =>

    {

    for (int k = 0; k < 10; k++)

    {

    Console.WriteLine("SumAsync {1} await Task.Run ManagedThreadId={0}", Thread.CurrentThread.ManagedThreadId, k);

    System.Threading.Thread.Sleep(1000);

    }

    for (long i = 0; i < 999999999; i++)

    {

    result += i;

    }

    });

    Console.WriteLine("SumAsync {1} end ManagedThreadId={0}", Thread.CurrentThread.ManagedThreadId, 111);

    return result;

    }

  • 相关阅读:
    12月14日总结观影数据集之大数据分析who
    12月09日总结python对json 数据转换
    12月12日总结观影数据集之大数据分析when
    阅读笔记
    12月11日总结观影数据集之大数据分析what
    12月13日总结where
    12月15日总结观影数据集之大数据分析how
    12月10日总结python数据备份
    12月16日观影大数据分析 how much
    可能的加分项
  • 原文地址:https://www.cnblogs.com/anyihen/p/12773269.html
Copyright © 2011-2022 走看看