zoukankan      html  css  js  c++  java
  • c# async await 理解 结合并行处理

    写两个方法

    第一个

    List<int> list = new List<int>();
    int i= 0;
    do
    {
        i++;
        list.Add(i);
    } while (i< 10);
    Console.WriteLine("开始执行时间:" + DateTime.Now.ToString());
    Parallel.ForEach(list, async item =>
    {
        var result = await Test();
        Console.WriteLine("线程" + result.ToString());
    });
    

    第二个

    public static async Task<string> Test()
    {
        return await Task.Run(() =>
          {
              Thread.Sleep(2000);
              Console.WriteLine("Test()方法里面线程ID: {0}", Thread.CurrentThread.ManagedThreadId);
              Console.WriteLine("执行时间:" + DateTime.Now.ToString());
              return Thread.CurrentThread.ManagedThreadId.ToString();
          });
    }
    

      

    可以区分来看

    Test() 是一个部分

    await  Test()又是一部分

    这两部分运行的位置不一样,第一部分就跟我们平时调用一样,在当前线程直接执行,第二部分的执行取决于我们await的对象,执行的位置也在await对象内部。

    这样子不太好看

    主线程碰到await后会立刻返回,以非阻塞的形式执行后面的代码。

    在Task对象前面用 await会阻塞线程,直到Task中的异步操作结束。程序才会继续执行。(也就是第二部分里面的r的方法对象是阻塞的,只有运行完才会继续执行)

    附上运行图

    第一次

    第二次

    可能觉得看的有点迷茫

    我们改一下代码 Console.WriteLine("Test()方法里面线程ID: {0},时间:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString());

    第三次执行

    发现在执行第二部分的时候,存在不是同步的情况

    理论上第二部分是同步的 

    这里出现异步的情况是因为并行

    我同时执行了10个线程 

    然后每个线程都执行第一部分 然后在执行第二部分

    如果仅仅只是执行1个线程 那么就是先第一部分 然后第二部分了

    欢迎补充...

  • 相关阅读:
    idea 配置mapper.xml代码提示
    vue配置请求转发解决跨域问题
    MySQL 连接出现 Authentication plugin 'caching_sha2_password' cannot be loaded
    判断链表是否有环(Java实现)
    Java实现链表反转(借助栈实现)
    IHS代理遇到404的问题
    麒峰可视化表单设计器vue版本
    2021.5.30发布内容
    表单常见问题说明
    排序算法与查找算法在项目中的实际应用
  • 原文地址:https://www.cnblogs.com/sajiao/p/11008642.html
Copyright © 2011-2022 走看看