zoukankan      html  css  js  c++  java
  • C# yield return 原理探究

    天需要些一个小工具,需要使用到多线程读写程序集,接口方法返回值类型需要为"IEnumerable<string>"这里用到了"yield return",但是同时也使用了同步锁,为了确认代码没有问题,决定分析下 yield 的实现原理,测试代码如下:

    class Program
    {
        public static void Main(string[] args)
        {
            IEnumerable<string> coll = CreateCollection();
    
            foreach (string str in coll)
            {
                Console.WriteLine($"read: {str}");
            }
        }
    
        private static IEnumerable<string> CreateCollection()
        {
            using (BlockingCollection<string> collection = new BlockingCollection<string>())
            {
                lock (globalLock)
                {
                    Exception err = null;
                    Task.Factory.StartNew(() =>
                    {
                        lock (globalLock)
                        {
                            for (int i = 0; i < 10; i++)
                            {
                                Thread.Sleep(100);
                                string value = $"value: {i}";
                                Console.WriteLine($"write: {value}");
                                collection.Add($"value: {i}");
                                Console.WriteLine($"end write: {value}");
                            }
                        }
                    }).ContinueWith((task) =>
                    {
                        collection.CompleteAdding();
                        err = task.Exception;
                    });
                }
    
                foreach (string item in collection.GetConsumingEnumerable())
                {
                    yield return item;
                }
            }
        }
    
        private static readonly object globalLock = new object();
    }

    运行以上代码,结果如下:

    yield return with multi thread result

    结果是期望结果,但无法确定是否有其他问题,所以决定查看下IL代码,如下:

      1 // Token: 0x02000002 RID: 2
      2 .class private auto ansi beforefieldinit ConsoleApp1.Program
      3     extends [mscorlib]System.Object
      4 {
      5     // Nested Types
      6     // Token: 0x02000003 RID: 3
      7     .class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass1_0'
      8         extends [mscorlib]System.Object
      9     {
     10         .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
     11             01 00 00 00
     12         )
     13         // Fields
     14         // Token: 0x04000002 RID: 2
     15         .field public class [System]System.Collections.Concurrent.BlockingCollection`1<string> collection
     16 
     17         // Methods
     18         // Token: 0x06000005 RID: 5 RVA: 0x000020CE File Offset: 0x000002CE
     19         .method public hidebysig specialname rtspecialname 
     20             instance void .ctor () cil managed 
     21         {
     22             // Header Size: 1 byte
     23             // Code Size: 8 (0x8) bytes
     24             .maxstack 8
     25 
     26             /* 0x000002CF 02           */ IL_0000: ldarg.0
     27             /* 0x000002D0 281A00000A   */ IL_0001: call      instance void [mscorlib]System.Object::.ctor()
     28             /* 0x000002D5 00           */ IL_0006: nop
     29             /* 0x000002D6 2A           */ IL_0007: ret
     30         } // end of method '<>c__DisplayClass1_0'::.ctor
     31 
     32         // Token: 0x06000006 RID: 6 RVA: 0x000020D8 File Offset: 0x000002D8
     33         .method assembly hidebysig 
     34             instance void '<CreateCollection>b__0' () cil managed 
     35         {
     36             // Header Size: 12 bytes
     37             // Code Size: 142 (0x8E) bytes
     38             // LocalVarSig Token: 0x11000002 RID: 2
     39             .maxstack 3
     40             .locals init (
     41                 [0] object,
     42                 [1] bool,
     43                 [2] int32 i,
     44                 [3] string 'value',
     45                 [4] bool
     46             )
     47 
     48             /* (31,21)-(31,22) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     49             /* 0x000002E4 00           */ IL_0000: nop
     50             /* (32,25)-(32,42) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     51             /* 0x000002E5 7E01000004   */ IL_0001: ldsfld    object ConsoleApp1.Program::globalLock
     52             /* 0x000002EA 0A           */ IL_0006: stloc.0
     53             /* 0x000002EB 16           */ IL_0007: ldc.i4.0
     54             /* 0x000002EC 0B           */ IL_0008: stloc.1
     55             .try
     56             {
     57                 /* 0x000002ED 06           */ IL_0009: ldloc.0
     58                 /* 0x000002EE 1201         */ IL_000A: ldloca.s  V_1
     59                 /* 0x000002F0 281B00000A   */ IL_000C: call      void [mscorlib]System.Threading.Monitor::Enter(object, bool&)
     60                 /* 0x000002F5 00           */ IL_0011: nop
     61                 /* (33,25)-(33,26) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     62                 /* 0x000002F6 00           */ IL_0012: nop
     63                 /* (34,34)-(34,43) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     64                 /* 0x000002F7 16           */ IL_0013: ldc.i4.0
     65                 /* 0x000002F8 0C           */ IL_0014: stloc.2
     66                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     67                 /* 0x000002F9 2B5D         */ IL_0015: br.s      IL_0074
     68                 // loop start (head: IL_0074)
     69                     /* (35,29)-(35,30) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     70                     /* 0x000002FB 00           */ IL_0017: nop
     71                     /* (36,33)-(36,51) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     72                     /* 0x000002FC 1F64         */ IL_0018: ldc.i4.s  100
     73                     /* 0x000002FE 281C00000A   */ IL_001A: call      void [mscorlib]System.Threading.Thread::Sleep(int32)
     74                     /* 0x00000303 00           */ IL_001F: nop
     75                     /* (37,33)-(37,62) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     76                     /* 0x00000304 720F000070   */ IL_0020: ldstr     "value: {0}"
     77                     /* 0x00000309 08           */ IL_0025: ldloc.2
     78                     /* 0x0000030A 8C1F000001   */ IL_0026: box       [mscorlib]System.Int32
     79                     /* 0x0000030F 281D00000A   */ IL_002B: call      string [mscorlib]System.String::Format(string, object)
     80                     /* 0x00000314 0D           */ IL_0030: stloc.3
     81                     /* (38,33)-(38,70) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     82                     /* 0x00000315 7225000070   */ IL_0031: ldstr     "write: "
     83                     /* 0x0000031A 09           */ IL_0036: ldloc.3
     84                     /* 0x0000031B 281800000A   */ IL_0037: call      string [mscorlib]System.String::Concat(string, string)
     85                     /* 0x00000320 281900000A   */ IL_003C: call      void [mscorlib]System.Console::WriteLine(string)
     86                     /* 0x00000325 00           */ IL_0041: nop
     87                     /* (39,33)-(39,63) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     88                     /* 0x00000326 02           */ IL_0042: ldarg.0
     89                     /* 0x00000327 7B02000004   */ IL_0043: ldfld     class [System]System.Collections.Concurrent.BlockingCollection`1<string> ConsoleApp1.Program/'<>c__DisplayClass1_0'::collection
     90                     /* 0x0000032C 720F000070   */ IL_0048: ldstr     "value: {0}"
     91                     /* 0x00000331 08           */ IL_004D: ldloc.2
     92                     /* 0x00000332 8C1F000001   */ IL_004E: box       [mscorlib]System.Int32
     93                     /* 0x00000337 281D00000A   */ IL_0053: call      string [mscorlib]System.String::Format(string, object)
     94                     /* 0x0000033C 6F1E00000A   */ IL_0058: callvirt  instance void class [System]System.Collections.Concurrent.BlockingCollection`1<string>::Add(!0)
     95                     /* 0x00000341 00           */ IL_005D: nop
     96                     /* (40,33)-(40,74) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     97                     /* 0x00000342 7235000070   */ IL_005E: ldstr     "end write: "
     98                     /* 0x00000347 09           */ IL_0063: ldloc.3
     99                     /* 0x00000348 281800000A   */ IL_0064: call      string [mscorlib]System.String::Concat(string, string)
    100                     /* 0x0000034D 281900000A   */ IL_0069: call      void [mscorlib]System.Console::WriteLine(string)
    101                     /* 0x00000352 00           */ IL_006E: nop
    102                     /* (41,29)-(41,30) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    103                     /* 0x00000353 00           */ IL_006F: nop
    104                     /* (34,53)-(34,56) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    105                     /* 0x00000354 08           */ IL_0070: ldloc.2
    106                     /* 0x00000355 17           */ IL_0071: ldc.i4.1
    107                     /* 0x00000356 58           */ IL_0072: add
    108                     /* 0x00000357 0C           */ IL_0073: stloc.2
    109 
    110                     /* (34,45)-(34,51) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    111                     /* 0x00000358 08           */ IL_0074: ldloc.2
    112                     /* 0x00000359 1F0A         */ IL_0075: ldc.i4.s  10
    113                     /* 0x0000035B FE04         */ IL_0077: clt
    114                     /* 0x0000035D 1304         */ IL_0079: stloc.s   V_4
    115                     /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    116                     /* 0x0000035F 1104         */ IL_007B: ldloc.s   V_4
    117                     /* 0x00000361 2D98         */ IL_007D: brtrue.s  IL_0017
    118                 // end loop
    119 
    120                 /* (42,25)-(42,26) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    121                 /* 0x00000363 00           */ IL_007F: nop
    122                 /* 0x00000364 DE0B         */ IL_0080: leave.s   IL_008D
    123             } // end .try
    124             finally
    125             {
    126                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    127                 /* 0x00000366 07           */ IL_0082: ldloc.1
    128                 /* 0x00000367 2C07         */ IL_0083: brfalse.s IL_008C
    129 
    130                 /* 0x00000369 06           */ IL_0085: ldloc.0
    131                 /* 0x0000036A 281F00000A   */ IL_0086: call      void [mscorlib]System.Threading.Monitor::Exit(object)
    132                 /* 0x0000036F 00           */ IL_008B: nop
    133 
    134                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    135                 /* 0x00000370 DC           */ IL_008C: endfinally
    136             } // end handler
    137 
    138             /* (43,21)-(43,22) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    139             /* 0x00000371 2A           */ IL_008D: ret
    140         } // end of method '<>c__DisplayClass1_0'::'<CreateCollection>b__0'
    141 
    142     } // end of class <>c__DisplayClass1_0
    143 
    144     // Token: 0x02000004 RID: 4
    145     .class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass1_1'
    146         extends [mscorlib]System.Object
    147     {
    148         .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
    149             01 00 00 00
    150         )
    151         // Fields
    152         // Token: 0x04000003 RID: 3
    153         .field public class [mscorlib]System.Exception err
    154         // Token: 0x04000004 RID: 4
    155         .field public class ConsoleApp1.Program/'<>c__DisplayClass1_0' 'CS$<>8__locals1'
    156 
    157         // Methods
    158         // Token: 0x06000007 RID: 7 RVA: 0x00002184 File Offset: 0x00000384
    159         .method public hidebysig specialname rtspecialname 
    160             instance void .ctor () cil managed 
    161         {
    162             // Header Size: 1 byte
    163             // Code Size: 8 (0x8) bytes
    164             .maxstack 8
    165 
    166             /* 0x00000385 02           */ IL_0000: ldarg.0
    167             /* 0x00000386 281A00000A   */ IL_0001: call      instance void [mscorlib]System.Object::.ctor()
    168             /* 0x0000038B 00           */ IL_0006: nop
    169             /* 0x0000038C 2A           */ IL_0007: ret
    170         } // end of method '<>c__DisplayClass1_1'::.ctor
    171 
    172         // Token: 0x06000008 RID: 8 RVA: 0x0000218D File Offset: 0x0000038D
    173         .method assembly hidebysig 
    174             instance void '<CreateCollection>b__1' (
    175                 class [mscorlib]System.Threading.Tasks.Task task
    176             ) cil managed 
    177         {
    178             // Header Size: 1 byte
    179             // Code Size: 31 (0x1F) bytes
    180             .maxstack 8
    181 
    182             /* (44,21)-(44,22) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    183             /* 0x0000038E 00           */ IL_0000: nop
    184             /* (45,25)-(45,53) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    185             /* 0x0000038F 02           */ IL_0001: ldarg.0
    186             /* 0x00000390 7B04000004   */ IL_0002: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<>c__DisplayClass1_1'::'CS$<>8__locals1'
    187             /* 0x00000395 7B02000004   */ IL_0007: ldfld     class [System]System.Collections.Concurrent.BlockingCollection`1<string> ConsoleApp1.Program/'<>c__DisplayClass1_0'::collection
    188             /* 0x0000039A 6F2000000A   */ IL_000C: callvirt  instance void class [System]System.Collections.Concurrent.BlockingCollection`1<string>::CompleteAdding()
    189             /* 0x0000039F 00           */ IL_0011: nop
    190             /* (46,25)-(46,46) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    191             /* 0x000003A0 02           */ IL_0012: ldarg.0
    192             /* 0x000003A1 03           */ IL_0013: ldarg.1
    193             /* 0x000003A2 6F2100000A   */ IL_0014: callvirt  instance class [mscorlib]System.AggregateException [mscorlib]System.Threading.Tasks.Task::get_Exception()
    194             /* 0x000003A7 7D03000004   */ IL_0019: stfld     class [mscorlib]System.Exception ConsoleApp1.Program/'<>c__DisplayClass1_1'::err
    195             /* (47,21)-(47,22) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    196             /* 0x000003AC 2A           */ IL_001E: ret
    197         } // end of method '<>c__DisplayClass1_1'::'<CreateCollection>b__1'
    198 
    199     } // end of class <>c__DisplayClass1_1
    200 
    201     // Token: 0x02000005 RID: 5
    202     .class nested private auto ansi sealed beforefieldinit '<CreateCollection>d__1'
    203         extends [mscorlib]System.Object
    204         implements class [mscorlib]System.Collections.Generic.IEnumerable`1<string>,
    205                    [mscorlib]System.Collections.IEnumerable,
    206                    class [mscorlib]System.Collections.Generic.IEnumerator`1<string>,
    207                    [mscorlib]System.IDisposable,
    208                    [mscorlib]System.Collections.IEnumerator
    209     {
    210         .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
    211             01 00 00 00
    212         )
    213         // Fields
    214         // Token: 0x04000005 RID: 5
    215         .field private int32 '<>1__state'
    216         // Token: 0x04000006 RID: 6
    217         .field private string '<>2__current'
    218         // Token: 0x04000007 RID: 7
    219         .field private int32 '<>l__initialThreadId'
    220         // Token: 0x04000008 RID: 8
    221         .field private class ConsoleApp1.Program/'<>c__DisplayClass1_0' '<>8__1'
    222         // Token: 0x04000009 RID: 9
    223         .field private object '<>s__2'
    224         // Token: 0x0400000A RID: 10
    225         .field private bool '<>s__3'
    226         // Token: 0x0400000B RID: 11
    227         .field private class ConsoleApp1.Program/'<>c__DisplayClass1_1' '<>8__4'
    228         // Token: 0x0400000C RID: 12
    229         .field private class [mscorlib]System.Collections.Generic.IEnumerator`1<string> '<>s__5'
    230         // Token: 0x0400000D RID: 13
    231         .field private string '<item>5__6'
    232 
    233         // Methods
    234         // Token: 0x06000009 RID: 9 RVA: 0x000021AD File Offset: 0x000003AD
    235         .method public hidebysig specialname rtspecialname 
    236             instance void .ctor (
    237                 int32 '<>1__state'
    238             ) cil managed 
    239         {
    240             .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
    241                 01 00 00 00
    242             )
    243             // Header Size: 1 byte
    244             // Code Size: 31 (0x1F) bytes
    245             .maxstack 8
    246 
    247             /* 0x000003AE 02           */ IL_0000: ldarg.0
    248             /* 0x000003AF 281A00000A   */ IL_0001: call      instance void [mscorlib]System.Object::.ctor()
    249             /* 0x000003B4 00           */ IL_0006: nop
    250             /* 0x000003B5 02           */ IL_0007: ldarg.0
    251             /* 0x000003B6 03           */ IL_0008: ldarg.1
    252             /* 0x000003B7 7D05000004   */ IL_0009: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
    253             /* 0x000003BC 02           */ IL_000E: ldarg.0
    254             /* 0x000003BD 282200000A   */ IL_000F: call      class [mscorlib]System.Threading.Thread [mscorlib]System.Threading.Thread::get_CurrentThread()
    255             /* 0x000003C2 6F2300000A   */ IL_0014: callvirt  instance int32 [mscorlib]System.Threading.Thread::get_ManagedThreadId()
    256             /* 0x000003C7 7D07000004   */ IL_0019: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>l__initialThreadId'
    257             /* 0x000003CC 2A           */ IL_001E: ret
    258         } // end of method '<CreateCollection>d__1'::.ctor
    259 
    260         // Token: 0x0600000A RID: 10 RVA: 0x000021D0 File Offset: 0x000003D0
    261         .method private final hidebysig newslot virtual 
    262             instance void System.IDisposable.Dispose () cil managed 
    263         {
    264             .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
    265                 01 00 00 00
    266             )
    267             .override method instance void [mscorlib]System.IDisposable::Dispose()
    268             // Header Size: 12 bytes
    269             // Code Size: 60 (0x3C) bytes
    270             // LocalVarSig Token: 0x11000003 RID: 3
    271             .maxstack 2
    272             .locals init (
    273                 [0] int32
    274             )
    275 
    276             /* 0x000003DC 02           */ IL_0000: ldarg.0
    277             /* 0x000003DD 7B05000004   */ IL_0001: ldfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
    278             /* 0x000003E2 0A           */ IL_0006: stloc.0
    279             /* 0x000003E3 06           */ IL_0007: ldloc.0
    280             /* 0x000003E4 1FFC         */ IL_0008: ldc.i4.s  -4
    281             /* 0x000003E6 59           */ IL_000A: sub
    282             /* 0x000003E7 17           */ IL_000B: ldc.i4.1
    283             /* 0x000003E8 3608         */ IL_000C: ble.un.s  IL_0016
    284 
    285             /* 0x000003EA 2B00         */ IL_000E: br.s      IL_0010
    286 
    287             /* 0x000003EC 06           */ IL_0010: ldloc.0
    288             /* 0x000003ED 17           */ IL_0011: ldc.i4.1
    289             /* 0x000003EE 2E02         */ IL_0012: beq.s     IL_0016
    290 
    291             /* 0x000003F0 2B25         */ IL_0014: br.s      IL_003B
    292 
    293             /* 0x000003F2 00           */ IL_0016: nop
    294             .try
    295             {
    296                 /* 0x000003F3 06           */ IL_0017: ldloc.0
    297                 /* 0x000003F4 1FFC         */ IL_0018: ldc.i4.s  -4
    298                 /* 0x000003F6 2E08         */ IL_001A: beq.s     IL_0024
    299 
    300                 /* 0x000003F8 2B00         */ IL_001C: br.s      IL_001E
    301 
    302                 /* 0x000003FA 06           */ IL_001E: ldloc.0
    303                 /* 0x000003FB 17           */ IL_001F: ldc.i4.1
    304                 /* 0x000003FC 2E02         */ IL_0020: beq.s     IL_0024
    305 
    306                 /* 0x000003FE 2B0C         */ IL_0022: br.s      IL_0030
    307 
    308                 /* 0x00000400 00           */ IL_0024: nop
    309                 .try
    310                 {
    311                     /* 0x00000401 DE07         */ IL_0025: leave.s   IL_002E
    312                 } // end .try
    313                 finally
    314                 {
    315                     /* 0x00000403 02           */ IL_0027: ldarg.0
    316                     /* 0x00000404 280D000006   */ IL_0028: call      instance void ConsoleApp1.Program/'<CreateCollection>d__1'::'<>m__Finally2'()
    317                     /* 0x00000409 DC           */ IL_002D: endfinally
    318                 } // end handler
    319 
    320                 /* 0x0000040A 2B00         */ IL_002E: br.s      IL_0030
    321 
    322                 /* 0x0000040C DE07         */ IL_0030: leave.s   IL_0039
    323             } // end .try
    324             finally
    325             {
    326                 /* 0x0000040E 02           */ IL_0032: ldarg.0
    327                 /* 0x0000040F 280C000006   */ IL_0033: call      instance void ConsoleApp1.Program/'<CreateCollection>d__1'::'<>m__Finally1'()
    328                 /* 0x00000414 DC           */ IL_0038: endfinally
    329             } // end handler
    330 
    331             /* 0x00000415 2B00         */ IL_0039: br.s      IL_003B
    332 
    333             /* 0x00000417 2A           */ IL_003B: ret
    334         } // end of method '<CreateCollection>d__1'::System.IDisposable.Dispose
    335 
    336         // Token: 0x0600000B RID: 11 RVA: 0x00002234 File Offset: 0x00000434
    337         .method private final hidebysig newslot virtual 
    338             instance bool MoveNext () cil managed 
    339         {
    340             .override method instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
    341             // Header Size: 12 bytes
    342             // Code Size: 397 (0x18D) bytes
    343             // LocalVarSig Token: 0x11000004 RID: 4
    344             .maxstack 3
    345             .locals init (
    346                 [0] bool,
    347                 [1] int32
    348             )
    349 
    350             .try
    351             {
    352                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    353                 /* 0x00000440 02           */ IL_0000: ldarg.0
    354                 /* 0x00000441 7B05000004   */ IL_0001: ldfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
    355                 /* 0x00000446 0B           */ IL_0006: stloc.1
    356                 /* 0x00000447 07           */ IL_0007: ldloc.1
    357                 /* 0x00000448 2C08         */ IL_0008: brfalse.s IL_0012
    358 
    359                 /* 0x0000044A 2B00         */ IL_000A: br.s      IL_000C
    360 
    361                 /* 0x0000044C 07           */ IL_000C: ldloc.1
    362                 /* 0x0000044D 17           */ IL_000D: ldc.i4.1
    363                 /* 0x0000044E 2E04         */ IL_000E: beq.s     IL_0014
    364 
    365                 /* 0x00000450 2B07         */ IL_0010: br.s      IL_0019
    366 
    367                 /* 0x00000452 2B0C         */ IL_0012: br.s      IL_0020
    368 
    369                 /* 0x00000454 382C010000   */ IL_0014: br        IL_0145
    370 
    371                 /* 0x00000459 16           */ IL_0019: ldc.i4.0
    372                 /* 0x0000045A 0A           */ IL_001A: stloc.0
    373                 /* 0x0000045B DD6B010000   */ IL_001B: leave     IL_018B
    374 
    375                 /* 0x00000460 02           */ IL_0020: ldarg.0
    376                 /* 0x00000461 15           */ IL_0021: ldc.i4.m1
    377                 /* 0x00000462 7D05000004   */ IL_0022: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
    378                 /* (24,9)-(24,10) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    379                 /* 0x00000467 00           */ IL_0027: nop
    380                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    381                 /* 0x00000468 02           */ IL_0028: ldarg.0
    382                 /* 0x00000469 7305000006   */ IL_0029: newobj    instance void ConsoleApp1.Program/'<>c__DisplayClass1_0'::.ctor()
    383                 /* 0x0000046E 7D08000004   */ IL_002E: stfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__1'
    384                 /* (25,20)-(25,92) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    385                 /* 0x00000473 02           */ IL_0033: ldarg.0
    386                 /* 0x00000474 7B08000004   */ IL_0034: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__1'
    387                 /* 0x00000479 732400000A   */ IL_0039: newobj    instance void class [System]System.Collections.Concurrent.BlockingCollection`1<string>::.ctor()
    388                 /* 0x0000047E 7D02000004   */ IL_003E: stfld     class [System]System.Collections.Concurrent.BlockingCollection`1<string> ConsoleApp1.Program/'<>c__DisplayClass1_0'::collection
    389                 /* 0x00000483 02           */ IL_0043: ldarg.0
    390                 /* 0x00000484 1FFD         */ IL_0044: ldc.i4.s  -3
    391                 /* 0x00000486 7D05000004   */ IL_0046: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
    392                 /* (26,13)-(26,14) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    393                 /* 0x0000048B 00           */ IL_004B: nop
    394                 /* (27,17)-(27,34) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    395                 /* 0x0000048C 02           */ IL_004C: ldarg.0
    396                 /* 0x0000048D 7E01000004   */ IL_004D: ldsfld    object ConsoleApp1.Program::globalLock
    397                 /* 0x00000492 7D09000004   */ IL_0052: stfld     object ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__2'
    398                 /* 0x00000497 02           */ IL_0057: ldarg.0
    399                 /* 0x00000498 16           */ IL_0058: ldc.i4.0
    400                 /* 0x00000499 7D0A000004   */ IL_0059: stfld     bool ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__3'
    401                 .try
    402                 {
    403                     /* 0x0000049E 02           */ IL_005E: ldarg.0
    404                     /* 0x0000049F 7B09000004   */ IL_005F: ldfld     object ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__2'
    405                     /* 0x000004A4 02           */ IL_0064: ldarg.0
    406                     /* 0x000004A5 7C0A000004   */ IL_0065: ldflda    bool ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__3'
    407                     /* 0x000004AA 281B00000A   */ IL_006A: call      void [mscorlib]System.Threading.Monitor::Enter(object, bool&)
    408                     /* 0x000004AF 00           */ IL_006F: nop
    409                     /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    410                     /* 0x000004B0 02           */ IL_0070: ldarg.0
    411                     /* 0x000004B1 7307000006   */ IL_0071: newobj    instance void ConsoleApp1.Program/'<>c__DisplayClass1_1'::.ctor()
    412                     /* 0x000004B6 7D0B000004   */ IL_0076: stfld     class ConsoleApp1.Program/'<>c__DisplayClass1_1' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__4'
    413                     /* 0x000004BB 02           */ IL_007B: ldarg.0
    414                     /* 0x000004BC 7B0B000004   */ IL_007C: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_1' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__4'
    415                     /* 0x000004C1 02           */ IL_0081: ldarg.0
    416                     /* 0x000004C2 7B08000004   */ IL_0082: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__1'
    417                     /* 0x000004C7 7D04000004   */ IL_0087: stfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<>c__DisplayClass1_1'::'CS$<>8__locals1'
    418                     /* (28,17)-(28,18) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    419                     /* 0x000004CC 00           */ IL_008C: nop
    420                     /* (29,21)-(29,42) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    421                     /* 0x000004CD 02           */ IL_008D: ldarg.0
    422                     /* 0x000004CE 7B0B000004   */ IL_008E: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_1' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__4'
    423                     /* 0x000004D3 14           */ IL_0093: ldnull
    424                     /* 0x000004D4 7D03000004   */ IL_0094: stfld     class [mscorlib]System.Exception ConsoleApp1.Program/'<>c__DisplayClass1_1'::err
    425                     /* (30,21)-(47,24) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    426                     /* 0x000004D9 282500000A   */ IL_0099: call      class [mscorlib]System.Threading.Tasks.TaskFactory [mscorlib]System.Threading.Tasks.Task::get_Factory()
    427                     /* 0x000004DE 02           */ IL_009E: ldarg.0
    428                     /* 0x000004DF 7B0B000004   */ IL_009F: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_1' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__4'
    429                     /* 0x000004E4 7B04000004   */ IL_00A4: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<>c__DisplayClass1_1'::'CS$<>8__locals1'
    430                     /* 0x000004E9 FE0606000006 */ IL_00A9: ldftn     instance void ConsoleApp1.Program/'<>c__DisplayClass1_0'::'<CreateCollection>b__0'()
    431                     /* 0x000004EF 732600000A   */ IL_00AF: newobj    instance void [mscorlib]System.Action::.ctor(object, native int)
    432                     /* 0x000004F4 6F2700000A   */ IL_00B4: callvirt  instance class [mscorlib]System.Threading.Tasks.Task [mscorlib]System.Threading.Tasks.TaskFactory::StartNew(class [mscorlib]System.Action)
    433                     /* 0x000004F9 02           */ IL_00B9: ldarg.0
    434                     /* 0x000004FA 7B0B000004   */ IL_00BA: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_1' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__4'
    435                     /* 0x000004FF FE0608000006 */ IL_00BF: ldftn     instance void ConsoleApp1.Program/'<>c__DisplayClass1_1'::'<CreateCollection>b__1'(class [mscorlib]System.Threading.Tasks.Task)
    436                     /* 0x00000505 732800000A   */ IL_00C5: newobj    instance void class [mscorlib]System.Action`1<class [mscorlib]System.Threading.Tasks.Task>::.ctor(object, native int)
    437                     /* 0x0000050A 6F2900000A   */ IL_00CA: callvirt  instance class [mscorlib]System.Threading.Tasks.Task [mscorlib]System.Threading.Tasks.Task::ContinueWith(class [mscorlib]System.Action`1<class [mscorlib]System.Threading.Tasks.Task>)
    438                     /* 0x0000050F 26           */ IL_00CF: pop
    439                     /* (48,17)-(48,18) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    440                     /* 0x00000510 00           */ IL_00D0: nop
    441                     /* 0x00000511 02           */ IL_00D1: ldarg.0
    442                     /* 0x00000512 14           */ IL_00D2: ldnull
    443                     /* 0x00000513 7D0B000004   */ IL_00D3: stfld     class ConsoleApp1.Program/'<>c__DisplayClass1_1' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__4'
    444                     /* 0x00000518 DE15         */ IL_00D8: leave.s   IL_00EF
    445                 } // end .try
    446                 finally
    447                 {
    448                     /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    449                     /* 0x0000051A 02           */ IL_00DA: ldarg.0
    450                     /* 0x0000051B 7B0A000004   */ IL_00DB: ldfld     bool ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__3'
    451                     /* 0x00000520 2C0C         */ IL_00E0: brfalse.s IL_00EE
    452 
    453                     /* 0x00000522 02           */ IL_00E2: ldarg.0
    454                     /* 0x00000523 7B09000004   */ IL_00E3: ldfld     object ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__2'
    455                     /* 0x00000528 281F00000A   */ IL_00E8: call      void [mscorlib]System.Threading.Monitor::Exit(object)
    456                     /* 0x0000052D 00           */ IL_00ED: nop
    457 
    458                     /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    459                     /* 0x0000052E DC           */ IL_00EE: endfinally
    460                 } // end handler
    461 
    462                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    463                 /* 0x0000052F 02           */ IL_00EF: ldarg.0
    464                 /* 0x00000530 14           */ IL_00F0: ldnull
    465                 /* 0x00000531 7D09000004   */ IL_00F1: stfld     object ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__2'
    466                 /* (50,17)-(50,24) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    467                 /* 0x00000536 00           */ IL_00F6: nop
    468                 /* (50,41)-(50,76) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    469                 /* 0x00000537 02           */ IL_00F7: ldarg.0
    470                 /* 0x00000538 02           */ IL_00F8: ldarg.0
    471                 /* 0x00000539 7B08000004   */ IL_00F9: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__1'
    472                 /* 0x0000053E 7B02000004   */ IL_00FE: ldfld     class [System]System.Collections.Concurrent.BlockingCollection`1<string> ConsoleApp1.Program/'<>c__DisplayClass1_0'::collection
    473                 /* 0x00000543 6F2A00000A   */ IL_0103: callvirt  instance class [mscorlib]System.Collections.Generic.IEnumerable`1<!0> class [System]System.Collections.Concurrent.BlockingCollection`1<string>::GetConsumingEnumerable()
    474                 /* 0x00000548 6F1500000A   */ IL_0108: callvirt  instance class [mscorlib]System.Collections.Generic.IEnumerator`1<!0> class [mscorlib]System.Collections.Generic.IEnumerable`1<string>::GetEnumerator()
    475                 /* 0x0000054D 7D0C000004   */ IL_010D: stfld     class [mscorlib]System.Collections.Generic.IEnumerator`1<string> ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__5'
    476                 /* 0x00000552 02           */ IL_0112: ldarg.0
    477                 /* 0x00000553 1FFC         */ IL_0113: ldc.i4.s  -4
    478                 /* 0x00000555 7D05000004   */ IL_0115: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
    479                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    480                 /* 0x0000055A 2B39         */ IL_011A: br.s      IL_0155
    481 
    482                 /* (50,26)-(50,37) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    483                 /* 0x0000055C 02           */ IL_011C: ldarg.0
    484                 /* 0x0000055D 02           */ IL_011D: ldarg.0
    485                 /* 0x0000055E 7B0C000004   */ IL_011E: ldfld     class [mscorlib]System.Collections.Generic.IEnumerator`1<string> ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__5'
    486                 /* 0x00000563 6F1200000A   */ IL_0123: callvirt  instance !0 class [mscorlib]System.Collections.Generic.IEnumerator`1<string>::get_Current()
    487                 /* 0x00000568 7D0D000004   */ IL_0128: stfld     string ConsoleApp1.Program/'<CreateCollection>d__1'::'<item>5__6'
    488                 /* (51,17)-(51,18) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    489                 /* 0x0000056D 00           */ IL_012D: nop
    490                 /* (52,21)-(52,39) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    491                 /* 0x0000056E 02           */ IL_012E: ldarg.0
    492                 /* 0x0000056F 02           */ IL_012F: ldarg.0
    493                 /* 0x00000570 7B0D000004   */ IL_0130: ldfld     string ConsoleApp1.Program/'<CreateCollection>d__1'::'<item>5__6'
    494                 /* 0x00000575 7D06000004   */ IL_0135: stfld     string ConsoleApp1.Program/'<CreateCollection>d__1'::'<>2__current'
    495                 /* 0x0000057A 02           */ IL_013A: ldarg.0
    496                 /* 0x0000057B 17           */ IL_013B: ldc.i4.1
    497                 /* 0x0000057C 7D05000004   */ IL_013C: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
    498                 /* 0x00000581 17           */ IL_0141: ldc.i4.1
    499                 /* 0x00000582 0A           */ IL_0142: stloc.0
    500                 /* 0x00000583 DE46         */ IL_0143: leave.s   IL_018B
    501 
    502                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    503                 /* 0x00000585 02           */ IL_0145: ldarg.0
    504                 /* 0x00000586 1FFC         */ IL_0146: ldc.i4.s  -4
    505                 /* 0x00000588 7D05000004   */ IL_0148: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
    506                 /* (53,17)-(53,18) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    507                 /* 0x0000058D 00           */ IL_014D: nop
    508                 /* 0x0000058E 02           */ IL_014E: ldarg.0
    509                 /* 0x0000058F 14           */ IL_014F: ldnull
    510                 /* 0x00000590 7D0D000004   */ IL_0150: stfld     string ConsoleApp1.Program/'<CreateCollection>d__1'::'<item>5__6'
    511 
    512                 /* (50,38)-(50,40) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    513                 /* 0x00000595 02           */ IL_0155: ldarg.0
    514                 /* 0x00000596 7B0C000004   */ IL_0156: ldfld     class [mscorlib]System.Collections.Generic.IEnumerator`1<string> ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__5'
    515                 /* 0x0000059B 6F1100000A   */ IL_015B: callvirt  instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
    516                 /* 0x000005A0 2DBA         */ IL_0160: brtrue.s  IL_011C
    517 
    518                 /* 0x000005A2 02           */ IL_0162: ldarg.0
    519                 /* 0x000005A3 280D000006   */ IL_0163: call      instance void ConsoleApp1.Program/'<CreateCollection>d__1'::'<>m__Finally2'()
    520                 /* 0x000005A8 00           */ IL_0168: nop
    521                 /* 0x000005A9 02           */ IL_0169: ldarg.0
    522                 /* 0x000005AA 14           */ IL_016A: ldnull
    523                 /* 0x000005AB 7D0C000004   */ IL_016B: stfld     class [mscorlib]System.Collections.Generic.IEnumerator`1<string> ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__5'
    524                 /* (54,13)-(54,14) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    525                 /* 0x000005B0 00           */ IL_0170: nop
    526                 /* 0x000005B1 02           */ IL_0171: ldarg.0
    527                 /* 0x000005B2 280C000006   */ IL_0172: call      instance void ConsoleApp1.Program/'<CreateCollection>d__1'::'<>m__Finally1'()
    528                 /* 0x000005B7 00           */ IL_0177: nop
    529                 /* 0x000005B8 02           */ IL_0178: ldarg.0
    530                 /* 0x000005B9 14           */ IL_0179: ldnull
    531                 /* 0x000005BA 7D08000004   */ IL_017A: stfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__1'
    532                 /* (55,9)-(55,10) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    533                 /* 0x000005BF 16           */ IL_017F: ldc.i4.0
    534                 /* 0x000005C0 0A           */ IL_0180: stloc.0
    535                 /* 0x000005C1 DE08         */ IL_0181: leave.s   IL_018B
    536             } // end .try
    537             fault
    538             {
    539                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    540                 /* 0x000005C3 02           */ IL_0183: ldarg.0
    541                 /* 0x000005C4 280A000006   */ IL_0184: call      instance void ConsoleApp1.Program/'<CreateCollection>d__1'::System.IDisposable.Dispose()
    542                 /* 0x000005C9 00           */ IL_0189: nop
    543                 /* 0x000005CA DC           */ IL_018A: endfinally
    544             } // end handler
    545 
    546             /* 0x000005CB 06           */ IL_018B: ldloc.0
    547             /* 0x000005CC 2A           */ IL_018C: ret
    548         } // end of method '<CreateCollection>d__1'::MoveNext
    549 
    550         // Token: 0x0600000C RID: 12 RVA: 0x00002404 File Offset: 0x00000604
    551         .method private hidebysig 
    552             instance void '<>m__Finally1' () cil managed 
    553         {
    554             // Header Size: 1 byte
    555             // Code Size: 38 (0x26) bytes
    556             .maxstack 8
    557 
    558             /* 0x00000605 02           */ IL_0000: ldarg.0
    559             /* 0x00000606 15           */ IL_0001: ldc.i4.m1
    560             /* 0x00000607 7D05000004   */ IL_0002: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
    561             /* 0x0000060C 02           */ IL_0007: ldarg.0
    562             /* 0x0000060D 7B08000004   */ IL_0008: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__1'
    563             /* 0x00000612 7B02000004   */ IL_000D: ldfld     class [System]System.Collections.Concurrent.BlockingCollection`1<string> ConsoleApp1.Program/'<>c__DisplayClass1_0'::collection
    564             /* 0x00000617 2C11         */ IL_0012: brfalse.s IL_0025
    565 
    566             /* 0x00000619 02           */ IL_0014: ldarg.0
    567             /* 0x0000061A 7B08000004   */ IL_0015: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__1'
    568             /* 0x0000061F 7B02000004   */ IL_001A: ldfld     class [System]System.Collections.Concurrent.BlockingCollection`1<string> ConsoleApp1.Program/'<>c__DisplayClass1_0'::collection
    569             /* 0x00000624 6F1000000A   */ IL_001F: callvirt  instance void [mscorlib]System.IDisposable::Dispose()
    570             /* 0x00000629 00           */ IL_0024: nop
    571 
    572             /* 0x0000062A 2A           */ IL_0025: ret
    573         } // end of method '<CreateCollection>d__1'::'<>m__Finally1'
    574 
    575         // Token: 0x0600000D RID: 13 RVA: 0x0000242B File Offset: 0x0000062B
    576         .method private hidebysig 
    577             instance void '<>m__Finally2' () cil managed 
    578         {
    579             // Header Size: 1 byte
    580             // Code Size: 29 (0x1D) bytes
    581             .maxstack 8
    582 
    583             /* 0x0000062C 02           */ IL_0000: ldarg.0
    584             /* 0x0000062D 1FFD         */ IL_0001: ldc.i4.s  -3
    585             /* 0x0000062F 7D05000004   */ IL_0003: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
    586             /* 0x00000634 02           */ IL_0008: ldarg.0
    587             /* 0x00000635 7B0C000004   */ IL_0009: ldfld     class [mscorlib]System.Collections.Generic.IEnumerator`1<string> ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__5'
    588             /* 0x0000063A 2C0C         */ IL_000E: brfalse.s IL_001C
    589 
    590             /* 0x0000063C 02           */ IL_0010: ldarg.0
    591             /* 0x0000063D 7B0C000004   */ IL_0011: ldfld     class [mscorlib]System.Collections.Generic.IEnumerator`1<string> ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__5'
    592             /* 0x00000642 6F1000000A   */ IL_0016: callvirt  instance void [mscorlib]System.IDisposable::Dispose()
    593             /* 0x00000647 00           */ IL_001B: nop
    594 
    595             /* 0x00000648 2A           */ IL_001C: ret
    596         } // end of method '<CreateCollection>d__1'::'<>m__Finally2'
    597 
    598         // Token: 0x0600000E RID: 14 RVA: 0x00002449 File Offset: 0x00000649
    599         .method private final hidebysig specialname newslot virtual 
    600             instance string 'System.Collections.Generic.IEnumerator<System.String>.get_Current' () cil managed 
    601         {
    602             .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
    603                 01 00 00 00
    604             )
    605             .override method instance !0 class [mscorlib]System.Collections.Generic.IEnumerator`1<string>::get_Current()
    606             // Header Size: 1 byte
    607             // Code Size: 7 (0x7) bytes
    608             .maxstack 8
    609 
    610             /* 0x0000064A 02           */ IL_0000: ldarg.0
    611             /* 0x0000064B 7B06000004   */ IL_0001: ldfld     string ConsoleApp1.Program/'<CreateCollection>d__1'::'<>2__current'
    612             /* 0x00000650 2A           */ IL_0006: ret
    613         } // end of method '<CreateCollection>d__1'::'System.Collections.Generic.IEnumerator<System.String>.get_Current'
    614 
    615         // Token: 0x0600000F RID: 15 RVA: 0x00002451 File Offset: 0x00000651
    616         .method private final hidebysig newslot virtual 
    617             instance void System.Collections.IEnumerator.Reset () cil managed 
    618         {
    619             .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
    620                 01 00 00 00
    621             )
    622             .override method instance void [mscorlib]System.Collections.IEnumerator::Reset()
    623             // Header Size: 1 byte
    624             // Code Size: 6 (0x6) bytes
    625             .maxstack 8
    626 
    627             /* 0x00000652 732B00000A   */ IL_0000: newobj    instance void [mscorlib]System.NotSupportedException::.ctor()
    628             /* 0x00000657 7A           */ IL_0005: throw
    629         } // end of method '<CreateCollection>d__1'::System.Collections.IEnumerator.Reset
    630 
    631         // Token: 0x06000010 RID: 16 RVA: 0x00002458 File Offset: 0x00000658
    632         .method private final hidebysig specialname newslot virtual 
    633             instance object System.Collections.IEnumerator.get_Current () cil managed 
    634         {
    635             .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
    636                 01 00 00 00
    637             )
    638             .override method instance object [mscorlib]System.Collections.IEnumerator::get_Current()
    639             // Header Size: 1 byte
    640             // Code Size: 7 (0x7) bytes
    641             .maxstack 8
    642 
    643             /* 0x00000659 02           */ IL_0000: ldarg.0
    644             /* 0x0000065A 7B06000004   */ IL_0001: ldfld     string ConsoleApp1.Program/'<CreateCollection>d__1'::'<>2__current'
    645             /* 0x0000065F 2A           */ IL_0006: ret
    646         } // end of method '<CreateCollection>d__1'::System.Collections.IEnumerator.get_Current
    647 
    648         // Token: 0x06000011 RID: 17 RVA: 0x00002460 File Offset: 0x00000660
    649         .method private final hidebysig newslot virtual 
    650             instance class [mscorlib]System.Collections.Generic.IEnumerator`1<string> 'System.Collections.Generic.IEnumerable<System.String>.GetEnumerator' () cil managed 
    651         {
    652             .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
    653                 01 00 00 00
    654             )
    655             .override method instance class [mscorlib]System.Collections.Generic.IEnumerator`1<!0> class [mscorlib]System.Collections.Generic.IEnumerable`1<string>::GetEnumerator()
    656             // Header Size: 12 bytes
    657             // Code Size: 48 (0x30) bytes
    658             // LocalVarSig Token: 0x11000005 RID: 5
    659             .maxstack 2
    660             .locals init (
    661                 [0] class ConsoleApp1.Program/'<CreateCollection>d__1'
    662             )
    663 
    664             /* 0x0000066C 02           */ IL_0000: ldarg.0
    665             /* 0x0000066D 7B05000004   */ IL_0001: ldfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
    666             /* 0x00000672 1FFE         */ IL_0006: ldc.i4.s  -2
    667             /* 0x00000674 331D         */ IL_0008: bne.un.s  IL_0027
    668 
    669             /* 0x00000676 02           */ IL_000A: ldarg.0
    670             /* 0x00000677 7B07000004   */ IL_000B: ldfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>l__initialThreadId'
    671             /* 0x0000067C 282200000A   */ IL_0010: call      class [mscorlib]System.Threading.Thread [mscorlib]System.Threading.Thread::get_CurrentThread()
    672             /* 0x00000681 6F2300000A   */ IL_0015: callvirt  instance int32 [mscorlib]System.Threading.Thread::get_ManagedThreadId()
    673             /* 0x00000686 330B         */ IL_001A: bne.un.s  IL_0027
    674 
    675             /* 0x00000688 02           */ IL_001C: ldarg.0
    676             /* 0x00000689 16           */ IL_001D: ldc.i4.0
    677             /* 0x0000068A 7D05000004   */ IL_001E: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
    678             /* 0x0000068F 02           */ IL_0023: ldarg.0
    679             /* 0x00000690 0A           */ IL_0024: stloc.0
    680             /* 0x00000691 2B07         */ IL_0025: br.s      IL_002E
    681 
    682             /* 0x00000693 16           */ IL_0027: ldc.i4.0
    683             /* 0x00000694 7309000006   */ IL_0028: newobj    instance void ConsoleApp1.Program/'<CreateCollection>d__1'::.ctor(int32)
    684             /* 0x00000699 0A           */ IL_002D: stloc.0
    685 
    686             /* 0x0000069A 06           */ IL_002E: ldloc.0
    687             /* 0x0000069B 2A           */ IL_002F: ret
    688         } // end of method '<CreateCollection>d__1'::'System.Collections.Generic.IEnumerable<System.String>.GetEnumerator'
    689 
    690         // Token: 0x06000012 RID: 18 RVA: 0x0000249C File Offset: 0x0000069C
    691         .method private final hidebysig newslot virtual 
    692             instance class [mscorlib]System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () cil managed 
    693         {
    694             .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
    695                 01 00 00 00
    696             )
    697             .override method instance class [mscorlib]System.Collections.IEnumerator [mscorlib]System.Collections.IEnumerable::GetEnumerator()
    698             // Header Size: 1 byte
    699             // Code Size: 7 (0x7) bytes
    700             .maxstack 8
    701 
    702             /* 0x0000069D 02           */ IL_0000: ldarg.0
    703             /* 0x0000069E 2811000006   */ IL_0001: call      instance class [mscorlib]System.Collections.Generic.IEnumerator`1<string> ConsoleApp1.Program/'<CreateCollection>d__1'::'System.Collections.Generic.IEnumerable<System.String>.GetEnumerator'()
    704             /* 0x000006A3 2A           */ IL_0006: ret
    705         } // end of method '<CreateCollection>d__1'::System.Collections.IEnumerable.GetEnumerator
    706 
    707         // Properties
    708         // Token: 0x17000001 RID: 1
    709         .property instance string 'System.Collections.Generic.IEnumerator<System.String>.Current'()
    710         {
    711             // Token: 0x0600000E RID: 14 RVA: 0x00002449 File Offset: 0x00000649
    712             .get instance string ConsoleApp1.Program/'<CreateCollection>d__1'::'System.Collections.Generic.IEnumerator<System.String>.get_Current'()
    713         }
    714         // Token: 0x17000002 RID: 2
    715         .property instance object System.Collections.IEnumerator.Current()
    716         {
    717             // Token: 0x06000010 RID: 16 RVA: 0x00002458 File Offset: 0x00000658
    718             .get instance object ConsoleApp1.Program/'<CreateCollection>d__1'::System.Collections.IEnumerator.get_Current()
    719         }
    720 
    721     } // end of class <CreateCollection>d__1
    722 
    723 
    724     // Fields
    725     // Token: 0x04000001 RID: 1
    726     .field private static initonly object globalLock
    727 
    728     // Methods
    729     // Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
    730     .method private hidebysig static 
    731         void Main (
    732             string[] args
    733         ) cil managed 
    734     {
    735         // Header Size: 12 bytes
    736         // Code Size: 67 (0x43) bytes
    737         // LocalVarSig Token: 0x11000001 RID: 1
    738         .maxstack 2
    739         .entrypoint
    740         .locals init (
    741             [0] class [mscorlib]System.Collections.Generic.IEnumerable`1<string> coll,
    742             [1] class [mscorlib]System.Collections.Generic.IEnumerator`1<string>,
    743             [2] string str
    744         )
    745 
    746         /* (13,9)-(13,10) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    747         /* 0x0000025C 00           */ IL_0000: nop
    748         /* (14,13)-(14,59) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    749         /* 0x0000025D 2802000006   */ IL_0001: call      class [mscorlib]System.Collections.Generic.IEnumerable`1<string> ConsoleApp1.Program::CreateCollection()
    750         /* 0x00000262 0A           */ IL_0006: stloc.0
    751         /* (15,13)-(15,14) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    752         /* 0x00000263 00           */ IL_0007: nop
    753         /* (16,17)-(16,24) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    754         /* 0x00000264 00           */ IL_0008: nop
    755         /* (16,40)-(16,44) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    756         /* 0x00000265 06           */ IL_0009: ldloc.0
    757         /* 0x00000266 6F1500000A   */ IL_000A: callvirt  instance class [mscorlib]System.Collections.Generic.IEnumerator`1<!0> class [mscorlib]System.Collections.Generic.IEnumerable`1<string>::GetEnumerator()
    758         /* 0x0000026B 0B           */ IL_000F: stloc.1
    759         .try
    760         {
    761             /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    762             /* 0x0000026C 2B1A         */ IL_0010: br.s      IL_002C
    763             // loop start (head: IL_002C)
    764                 /* (16,26)-(16,36) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    765                 /* 0x0000026E 07           */ IL_0012: ldloc.1
    766                 /* 0x0000026F 6F1200000A   */ IL_0013: callvirt  instance !0 class [mscorlib]System.Collections.Generic.IEnumerator`1<string>::get_Current()
    767                 /* 0x00000274 0C           */ IL_0018: stloc.2
    768                 /* (17,17)-(17,18) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    769                 /* 0x00000275 00           */ IL_0019: nop
    770                 /* (18,21)-(18,55) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    771                 /* 0x00000276 7201000070   */ IL_001A: ldstr     "read: "
    772                 /* 0x0000027B 08           */ IL_001F: ldloc.2
    773                 /* 0x0000027C 281800000A   */ IL_0020: call      string [mscorlib]System.String::Concat(string, string)
    774                 /* 0x00000281 281900000A   */ IL_0025: call      void [mscorlib]System.Console::WriteLine(string)
    775                 /* 0x00000286 00           */ IL_002A: nop
    776                 /* (19,17)-(19,18) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    777                 /* 0x00000287 00           */ IL_002B: nop
    778 
    779                 /* (16,37)-(16,39) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    780                 /* 0x00000288 07           */ IL_002C: ldloc.1
    781                 /* 0x00000289 6F1100000A   */ IL_002D: callvirt  instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
    782                 /* 0x0000028E 2DDE         */ IL_0032: brtrue.s  IL_0012
    783             // end loop
    784 
    785             /* 0x00000290 DE0B         */ IL_0034: leave.s   IL_0041
    786         } // end .try
    787         finally
    788         {
    789             /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    790             /* 0x00000292 07           */ IL_0036: ldloc.1
    791             /* 0x00000293 2C07         */ IL_0037: brfalse.s IL_0040
    792 
    793             /* 0x00000295 07           */ IL_0039: ldloc.1
    794             /* 0x00000296 6F1000000A   */ IL_003A: callvirt  instance void [mscorlib]System.IDisposable::Dispose()
    795             /* 0x0000029B 00           */ IL_003F: nop
    796 
    797             /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    798             /* 0x0000029C DC           */ IL_0040: endfinally
    799         } // end handler
    800 
    801         /* (20,13)-(20,14) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    802         /* 0x0000029D 00           */ IL_0041: nop
    803         /* (21,9)-(21,10) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    804         /* 0x0000029E 2A           */ IL_0042: ret
    805     } // end of method Program::Main
    806 
    807     // Token: 0x06000002 RID: 2 RVA: 0x000020B0 File Offset: 0x000002B0
    808     .method private hidebysig static 
    809         class [mscorlib]System.Collections.Generic.IEnumerable`1<string> CreateCollection () cil managed 
    810     {
    811         // Header Size: 1 byte
    812         // Code Size: 8 (0x8) bytes
    813         .maxstack 8
    814 
    815         /* 0x000002B1 1FFE         */ IL_0000: ldc.i4.s  -2
    816         /* 0x000002B3 7309000006   */ IL_0002: newobj    instance void ConsoleApp1.Program/'<CreateCollection>d__1'::.ctor(int32)
    817         /* 0x000002B8 2A           */ IL_0007: ret
    818     } // end of method Program::CreateCollection
    819 
    820     // Token: 0x06000003 RID: 3 RVA: 0x000020B9 File Offset: 0x000002B9
    821     .method public hidebysig specialname rtspecialname 
    822         instance void .ctor () cil managed 
    823     {
    824         // Header Size: 1 byte
    825         // Code Size: 8 (0x8) bytes
    826         .maxstack 8
    827 
    828         /* 0x000002BA 02           */ IL_0000: ldarg.0
    829         /* 0x000002BB 281A00000A   */ IL_0001: call      instance void [mscorlib]System.Object::.ctor()
    830         /* 0x000002C0 00           */ IL_0006: nop
    831         /* 0x000002C1 2A           */ IL_0007: ret
    832     } // end of method Program::.ctor
    833 
    834     // Token: 0x06000004 RID: 4 RVA: 0x000020C2 File Offset: 0x000002C2
    835     .method private hidebysig specialname rtspecialname static 
    836         void .cctor () cil managed 
    837     {
    838         // Header Size: 1 byte
    839         // Code Size: 11 (0xB) bytes
    840         .maxstack 8
    841 
    842         /* (58,9)-(58,66) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    843         /* 0x000002C3 731A00000A   */ IL_0000: newobj    instance void [mscorlib]System.Object::.ctor()
    844         /* 0x000002C8 8001000004   */ IL_0005: stsfld    object ConsoleApp1.Program::globalLock
    845         /* 0x000002CD 2A           */ IL_000A: ret
    846     } // end of method Program::.cctor
    847 
    848 } // end of class ConsoleApp1.Program
    View Code

    为了清晰显示其逻辑,对应IL,重写其逻辑如下:

      1 class Program
      2 {
      3     static void Main(string[] args)
      4     {
      5         IEnumerable<string> coll = CreateCollection();
      6         IEnumerator<string> enumerator = coll.GetEnumerator();
      7         string str = null;
      8 
      9         try
     10         {
     11             goto IL_002C;
     12         IL_0012:
     13             str = enumerator.Current;
     14 
     15             Console.WriteLine(string.Concat("read: ", str));
     16 
     17         IL_002C:
     18             if (enumerator.MoveNext())
     19             {
     20                 goto IL_0012;
     21             }
     22         }
     23         finally
     24         {
     25             if (enumerator != null)
     26             {
     27                 enumerator.Dispose();
     28             }
     29         }
     30     }
     31 
     32     private static IEnumerable<string> CreateCollection()
     33     {
     34         return new CreateCollection_1(-2);
     35     } 
     36 
     37     private static readonly object globalLock = new object();
     38 
     39     private class DisplayClass1_0
     40     {
     41         public BlockingCollection<string> collection;
     42 
     43         public DisplayClass1_0()
     44         {
     45 
     46         }
     47 
     48         public void CreateCollection()
     49         {
     50             object loc0 = Program.globalLock;
     51             bool loc1 = false;
     52             int i = 0;
     53             string value;
     54             bool arg4;
     55 
     56             try
     57             {
     58                 Monitor.Enter(loc0, ref loc1);
     59 
     60                 goto IL_0074;
     61             IL_0017:
     62                 Thread.Sleep(100);
     63                 value = string.Format("value: {0}", i);
     64                 Console.WriteLine(string.Concat("write: ", value));
     65                 collection.Add(string.Format("value: {0}", i));
     66                 Console.WriteLine(string.Concat("end write: ", value));
     67                 i = i + 1;
     68             IL_0074:
     69                 arg4 = i < 10;
     70                 if (arg4)
     71                 {
     72                     goto IL_0017;
     73                 }
     74             }
     75             finally
     76             {
     77                 if (loc1)
     78                 {
     79                     Monitor.Exit(loc0);
     80                 }
     81             }
     82         }
     83     }
     84 
     85     private class DisplayClass1_1
     86     {
     87         public Exception err;
     88         public DisplayClass1_0 locals1;
     89 
     90         public DisplayClass1_1() { }
     91 
     92         public void CreateCollection(Task task)
     93         {
     94             locals1.collection.CompleteAdding();
     95             err = task.Exception;
     96         }
     97     }
     98 
     99     private class CreateCollection_1
    100         : IEnumerable<string>,
    101         IEnumerable,
    102         IEnumerator<string>,
    103         IEnumerator,
    104         IDisposable
    105     {
    106         private int state;
    107         private string current;
    108         private int initialThreadId;
    109 
    110         private DisplayClass1_0 f8__1;
    111 
    112         private object s__2;
    113         private bool s__3;
    114 
    115         private DisplayClass1_1 f8__4;
    116 
    117         private IEnumerator<string> s__5;
    118 
    119         private string item5__6;
    120 
    121         public CreateCollection_1(int state)
    122         {
    123             this.state = state;
    124             this.initialThreadId
    125                 = Thread.CurrentThread.ManagedThreadId;
    126         }
    127 
    128         void IDisposable.Dispose()
    129         {
    130             int loc_0 = this.state;
    131             if (loc_0 + 4 <= 1)
    132             {
    133                 goto IL_0016;
    134             }
    135             if (loc_0 == 1)
    136             {
    137                 return;
    138             }
    139 
    140         IL_0016:
    141             ;
    142 
    143             try
    144             {
    145                 if (loc_0 == -4)
    146                 {
    147                     goto IL_0024;
    148                 }
    149 
    150                 if (loc_0 == 1)
    151                 {
    152                     goto IL_0024;
    153                 }
    154                 return;
    155 
    156             IL_0024:;
    157 
    158                 try
    159                 {
    160                 }
    161                 finally
    162                 {
    163                     this.m__Finally2();
    164                 }
    165             }
    166             finally
    167             {
    168                 this.m__Finally1();
    169             }
    170         }
    171 
    172         bool IEnumerator.MoveNext()
    173         {
    174             bool loc_0;
    175             int loc_1;
    176 
    177             try
    178             {
    179                 loc_1 = this.state;
    180                 if (loc_1 == 0)
    181                 {
    182                     goto IL_0012;
    183                 }
    184                 if (loc_1 == 1)
    185                 {
    186                     goto IL_0014;
    187                 }
    188                 goto IL_0019;
    189 
    190             IL_0012:;
    191                 goto IL_0020;
    192             IL_0014:;
    193                 goto IL_0145;
    194             IL_0019:;
    195                 return false;
    196             IL_0020:;
    197                 this.state = -1;
    198                 this.f8__1 = new DisplayClass1_0();
    199                 this.f8__1.collection = new BlockingCollection<string>();
    200                 this.state = -3;
    201                 this.s__2 = Program.globalLock;
    202                 this.s__3 = false;
    203 
    204                 try
    205                 {
    206                     Monitor.Enter(this.s__2, ref this.s__3);
    207 
    208                     this.f8__4 = new DisplayClass1_1();
    209                     this.f8__4.locals1 = this.f8__1;
    210                     this.f8__4.err = null;
    211 
    212                     Task.Factory.StartNew(new Action(this.f8__4.locals1.CreateCollection))
    213                         .ContinueWith(new Action<Task>(this.f8__4.CreateCollection));
    214 
    215                     this.f8__4 = null;
    216                 }
    217                 finally
    218                 {
    219                     if (this.s__3)
    220                     {
    221                         Monitor.Exit(this.s__2);
    222                     }
    223                 }
    224 
    225                 this.s__2 = null;
    226 
    227                 this.s__5 =
    228                     this.f8__1
    229                     .collection
    230                     .GetConsumingEnumerable()
    231                     .GetEnumerator();
    232 
    233                 this.state = -4;
    234 
    235                 goto IL_0155;
    236             IL_011C:
    237                 this.item5__6 = this.s__5.Current;
    238 
    239                 this.current = this.item5__6;
    240 
    241                 this.state = 1;
    242                 loc_0 = true;
    243 
    244                 return loc_0;
    245 
    246             IL_0145:
    247                 this.state = -4;
    248                 this.item5__6 = null;
    249             IL_0155:
    250                 if (this.s__5.MoveNext())
    251                 {
    252                     goto IL_011C;
    253                 }
    254 
    255                 this.m__Finally2();
    256                 this.s__5 = null;
    257 
    258                 this.m__Finally1();
    259 
    260                 this.f8__1 = null;
    261 
    262                 loc_0 = false;
    263                 return loc_0;
    264             }
    265             finally
    266             {
    267                 ((IDisposable)this).Dispose();
    268             }
    269         }
    270 
    271         private void m__Finally2()
    272         {
    273             this.state = -3;
    274             if (this.s__5 == null)
    275             {
    276                 return;
    277             }
    278 
    279             this.s__5.Dispose();
    280         }
    281 
    282         private void m__Finally1()
    283         {
    284             this.state = -1;
    285 
    286             if (this.f8__1 == null || this.f8__1.collection == null)
    287             {
    288                 return;
    289             }
    290             this.f8__1.collection.Dispose();
    291         }
    292 
    293         string IEnumerator<string>.Current
    294         {
    295             get
    296             {
    297                 return this.current;
    298             }
    299         }
    300 
    301         void IEnumerator.Reset()
    302         {
    303             throw new NotSupportedException();
    304         }
    305 
    306         object IEnumerator.Current
    307         {
    308             get
    309             {
    310                 return this.current;
    311             }
    312         }
    313 
    314         IEnumerator<string> IEnumerable<string>.GetEnumerator()
    315         {
    316             CreateCollection_1 createCollection = null;
    317             if (this.state != -2)
    318             {
    319                 goto IL_0027;
    320             }
    321 
    322             if (this.initialThreadId != Thread.CurrentThread.ManagedThreadId)
    323             {
    324                 goto IL_0027;
    325             }
    326 
    327             this.state = 0;
    328             createCollection = this;
    329             goto IL_002E;
    330         IL_0027:;
    331             createCollection = new CreateCollection_1(0);
    332         IL_002E:
    333             return createCollection;
    334         }
    335 
    336         IEnumerator IEnumerable.GetEnumerator()
    337         {
    338             return ((IEnumerable<string>)this).GetEnumerator();
    339         }
    340     }
    341 }

    为了可以使之可以编译通过,修改了不合法的类名、变量名等,编译并运行的结果和源码一样,接下来就是仔细看其实现逻辑了。

    对于Main方法,其逻辑即为通过方法 CreateCollection() 获取一个IEnumerable<string>对象,没啥好看的。

    里查看 CreateCollection() 方法的实现,发现我们的逻辑都不见了,取而代之的是返回了一个 CreateCollection_1 对象实例,这就是我们的迭代器了。

    1 private static IEnumerable<string> CreateCollection()
    2 {
    3     return new CreateCollection_1(-2);
    4 } 

    那么 CreateCollection_1 类都做了什么呢?

    我们发现,该类分别实现了 IEnumerable<string>, IEnumerable, IEnumerator<string>, IEnumerator, IDisposable 共五个接口,并且创建了两个新的内部类,DisplayClass1_0 和 DisplayClass1_1,分别对应我们 Task 启动的线程逻辑。

    我们看 CreateCollection_1.MoveNext() 方法和 DisplayClass1_0.CreateCollection()方法,发现两个方法均加了锁,而且 CreateCollection_1 类有线程校验。

    但是我们的要求是 CreateCollection() 方法内代码同步,既然编译器会自动添加锁,那么将代码改为如下形式会怎么样呢?

    class Program
    {
        public static void Main(string[] args)
        {
            Task.Factory.StartNew(() =>
            {
                Console.WriteLine($"start ----------> {Thread.CurrentThread.ManagedThreadId}");
                IEnumerable<string> coll = CreateCollection();
    
                foreach (string str in coll)
                {
                    Console.WriteLine($"read [{Thread.CurrentThread.ManagedThreadId}]: {str}");
                }
            });
    
            Task.Factory.StartNew(() =>
            {
                Console.WriteLine($"start ----------> {Thread.CurrentThread.ManagedThreadId}");
                IEnumerable<string> coll = CreateCollection();
    
                foreach (string str in coll)
                {
                    Console.WriteLine($"read [{Thread.CurrentThread.ManagedThreadId}]: {str}");
                }
            });
    
            Console.ReadKey();
        }
    
        private static IEnumerable<string> CreateCollection()
        {
            using (BlockingCollection<string> collection = new BlockingCollection<string>())
            {
                lock (globalLock)
                {
                    Exception err = null;
                    Task.Factory.StartNew(() =>
                    {
                        Console.WriteLine("start new ...");
                        for (int i = 0; i < 10; i++)
                        {
                            Thread.Sleep(100);
                            string value = $"value: {i}";
                            Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] write: {value}");
                            collection.Add($"value: {i}");
                            Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] end write: {value}");
                        }
                    }).ContinueWith((task) =>
                    {
                        collection.CompleteAdding();
                        err = task.Exception;
                    });
    
                    foreach (string item in collection.GetConsumingEnumerable())
                    {
                        yield return item;
                    }
                }
            }
        }
    
        private static readonly object globalLock = new object();
    }

    运行结果如下:

    结果看起来是正确的,那么靠谱吗?还是到IL里面查找答案:

       1 // Token: 0x02000002 RID: 2
       2 .class private auto ansi beforefieldinit ConsoleApp1.Program
       3     extends [mscorlib]System.Object
       4 {
       5     // Nested Types
       6     // Token: 0x02000003 RID: 3
       7     .class nested private auto ansi sealed serializable beforefieldinit '<>c'
       8         extends [mscorlib]System.Object
       9     {
      10         .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
      11             01 00 00 00
      12         )
      13         // Fields
      14         // Token: 0x04000002 RID: 2
      15         .field public static initonly class ConsoleApp1.Program/'<>c' '<>9'
      16         // Token: 0x04000003 RID: 3
      17         .field public static class [mscorlib]System.Action '<>9__0_0'
      18         // Token: 0x04000004 RID: 4
      19         .field public static class [mscorlib]System.Action '<>9__0_1'
      20 
      21         // Methods
      22         // Token: 0x06000005 RID: 5 RVA: 0x000020D6 File Offset: 0x000002D6
      23         .method private hidebysig specialname rtspecialname static 
      24             void .cctor () cil managed 
      25         {
      26             // Header Size: 1 byte
      27             // Code Size: 11 (0xB) bytes
      28             .maxstack 8
      29 
      30             /* 0x000002D7 7306000006   */ IL_0000: newobj    instance void ConsoleApp1.Program/'<>c'::.ctor()
      31             /* 0x000002DC 8002000004   */ IL_0005: stsfld    class ConsoleApp1.Program/'<>c' ConsoleApp1.Program/'<>c'::'<>9'
      32             /* 0x000002E1 2A           */ IL_000A: ret
      33         } // end of method '<>c'::.cctor
      34 
      35         // Token: 0x06000006 RID: 6 RVA: 0x000020E2 File Offset: 0x000002E2
      36         .method public hidebysig specialname rtspecialname 
      37             instance void .ctor () cil managed 
      38         {
      39             // Header Size: 1 byte
      40             // Code Size: 8 (0x8) bytes
      41             .maxstack 8
      42 
      43             /* 0x000002E3 02           */ IL_0000: ldarg.0
      44             /* 0x000002E4 281C00000A   */ IL_0001: call      instance void [mscorlib]System.Object::.ctor()
      45             /* 0x000002E9 00           */ IL_0006: nop
      46             /* 0x000002EA 2A           */ IL_0007: ret
      47         } // end of method '<>c'::.ctor
      48 
      49         // Token: 0x06000007 RID: 7 RVA: 0x000020EC File Offset: 0x000002EC
      50         .method assembly hidebysig 
      51             instance void '<Main>b__0_0' () cil managed 
      52         {
      53             // Header Size: 12 bytes
      54             // Code Size: 111 (0x6F) bytes
      55             // LocalVarSig Token: 0x11000001 RID: 1
      56             .maxstack 3
      57             .locals init (
      58                 [0] class [mscorlib]System.Collections.Generic.IEnumerable`1<string> coll,
      59                 [1] class [mscorlib]System.Collections.Generic.IEnumerator`1<string>,
      60                 [2] string str
      61             )
      62 
      63             /* (14,13)-(14,14) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
      64             /* 0x000002F8 00           */ IL_0000: nop
      65             /* (15,17)-(15,96) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
      66             /* 0x000002F9 7201000070   */ IL_0001: ldstr     "start ----------> {0}"
      67             /* 0x000002FE 281D00000A   */ IL_0006: call      class [mscorlib]System.Threading.Thread [mscorlib]System.Threading.Thread::get_CurrentThread()
      68             /* 0x00000303 6F1E00000A   */ IL_000B: callvirt  instance int32 [mscorlib]System.Threading.Thread::get_ManagedThreadId()
      69             /* 0x00000308 8C20000001   */ IL_0010: box       [mscorlib]System.Int32
      70             /* 0x0000030D 281F00000A   */ IL_0015: call      string [mscorlib]System.String::Format(string, object)
      71             /* 0x00000312 282000000A   */ IL_001A: call      void [mscorlib]System.Console::WriteLine(string)
      72             /* 0x00000317 00           */ IL_001F: nop
      73             /* (16,17)-(16,63) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
      74             /* 0x00000318 2802000006   */ IL_0020: call      class [mscorlib]System.Collections.Generic.IEnumerable`1<string> ConsoleApp1.Program::CreateCollection()
      75             /* 0x0000031D 0A           */ IL_0025: stloc.0
      76             /* (18,17)-(18,24) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
      77             /* 0x0000031E 00           */ IL_0026: nop
      78             /* (18,40)-(18,44) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
      79             /* 0x0000031F 06           */ IL_0027: ldloc.0
      80             /* 0x00000320 6F1500000A   */ IL_0028: callvirt  instance class [mscorlib]System.Collections.Generic.IEnumerator`1<!0> class [mscorlib]System.Collections.Generic.IEnumerable`1<string>::GetEnumerator()
      81             /* 0x00000325 0B           */ IL_002D: stloc.1
      82             .try
      83             {
      84                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
      85                 /* 0x00000326 2B29         */ IL_002E: br.s      IL_0059
      86                 // loop start (head: IL_0059)
      87                     /* (18,26)-(18,36) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
      88                     /* 0x00000328 07           */ IL_0030: ldloc.1
      89                     /* 0x00000329 6F1200000A   */ IL_0031: callvirt  instance !0 class [mscorlib]System.Collections.Generic.IEnumerator`1<string>::get_Current()
      90                     /* 0x0000032E 0C           */ IL_0036: stloc.2
      91                     /* (19,17)-(19,18) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
      92                     /* 0x0000032F 00           */ IL_0037: nop
      93                     /* (20,21)-(20,96) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
      94                     /* 0x00000330 722D000070   */ IL_0038: ldstr     "read [{0}]: {1}"
      95                     /* 0x00000335 281D00000A   */ IL_003D: call      class [mscorlib]System.Threading.Thread [mscorlib]System.Threading.Thread::get_CurrentThread()
      96                     /* 0x0000033A 6F1E00000A   */ IL_0042: callvirt  instance int32 [mscorlib]System.Threading.Thread::get_ManagedThreadId()
      97                     /* 0x0000033F 8C20000001   */ IL_0047: box       [mscorlib]System.Int32
      98                     /* 0x00000344 08           */ IL_004C: ldloc.2
      99                     /* 0x00000345 282100000A   */ IL_004D: call      string [mscorlib]System.String::Format(string, object, object)
     100                     /* 0x0000034A 282000000A   */ IL_0052: call      void [mscorlib]System.Console::WriteLine(string)
     101                     /* 0x0000034F 00           */ IL_0057: nop
     102                     /* (21,17)-(21,18) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     103                     /* 0x00000350 00           */ IL_0058: nop
     104 
     105                     /* (18,37)-(18,39) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     106                     /* 0x00000351 07           */ IL_0059: ldloc.1
     107                     /* 0x00000352 6F1100000A   */ IL_005A: callvirt  instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
     108                     /* 0x00000357 2DCF         */ IL_005F: brtrue.s  IL_0030
     109                 // end loop
     110 
     111                 /* 0x00000359 DE0B         */ IL_0061: leave.s   IL_006E
     112             } // end .try
     113             finally
     114             {
     115                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     116                 /* 0x0000035B 07           */ IL_0063: ldloc.1
     117                 /* 0x0000035C 2C07         */ IL_0064: brfalse.s IL_006D
     118 
     119                 /* 0x0000035E 07           */ IL_0066: ldloc.1
     120                 /* 0x0000035F 6F1000000A   */ IL_0067: callvirt  instance void [mscorlib]System.IDisposable::Dispose()
     121                 /* 0x00000364 00           */ IL_006C: nop
     122 
     123                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     124                 /* 0x00000365 DC           */ IL_006D: endfinally
     125             } // end handler
     126 
     127             /* (22,13)-(22,14) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     128             /* 0x00000366 2A           */ IL_006E: ret
     129         } // end of method '<>c'::'<Main>b__0_0'
     130 
     131         // Token: 0x06000008 RID: 8 RVA: 0x00002178 File Offset: 0x00000378
     132         .method assembly hidebysig 
     133             instance void '<Main>b__0_1' () cil managed 
     134         {
     135             // Header Size: 12 bytes
     136             // Code Size: 111 (0x6F) bytes
     137             // LocalVarSig Token: 0x11000001 RID: 1
     138             .maxstack 3
     139             .locals init (
     140                 [0] class [mscorlib]System.Collections.Generic.IEnumerable`1<string> coll,
     141                 [1] class [mscorlib]System.Collections.Generic.IEnumerator`1<string>,
     142                 [2] string str
     143             )
     144 
     145             /* (25,13)-(25,14) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     146             /* 0x00000384 00           */ IL_0000: nop
     147             /* (26,17)-(26,96) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     148             /* 0x00000385 7201000070   */ IL_0001: ldstr     "start ----------> {0}"
     149             /* 0x0000038A 281D00000A   */ IL_0006: call      class [mscorlib]System.Threading.Thread [mscorlib]System.Threading.Thread::get_CurrentThread()
     150             /* 0x0000038F 6F1E00000A   */ IL_000B: callvirt  instance int32 [mscorlib]System.Threading.Thread::get_ManagedThreadId()
     151             /* 0x00000394 8C20000001   */ IL_0010: box       [mscorlib]System.Int32
     152             /* 0x00000399 281F00000A   */ IL_0015: call      string [mscorlib]System.String::Format(string, object)
     153             /* 0x0000039E 282000000A   */ IL_001A: call      void [mscorlib]System.Console::WriteLine(string)
     154             /* 0x000003A3 00           */ IL_001F: nop
     155             /* (27,17)-(27,63) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     156             /* 0x000003A4 2802000006   */ IL_0020: call      class [mscorlib]System.Collections.Generic.IEnumerable`1<string> ConsoleApp1.Program::CreateCollection()
     157             /* 0x000003A9 0A           */ IL_0025: stloc.0
     158             /* (29,17)-(29,24) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     159             /* 0x000003AA 00           */ IL_0026: nop
     160             /* (29,40)-(29,44) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     161             /* 0x000003AB 06           */ IL_0027: ldloc.0
     162             /* 0x000003AC 6F1500000A   */ IL_0028: callvirt  instance class [mscorlib]System.Collections.Generic.IEnumerator`1<!0> class [mscorlib]System.Collections.Generic.IEnumerable`1<string>::GetEnumerator()
     163             /* 0x000003B1 0B           */ IL_002D: stloc.1
     164             .try
     165             {
     166                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     167                 /* 0x000003B2 2B29         */ IL_002E: br.s      IL_0059
     168                 // loop start (head: IL_0059)
     169                     /* (29,26)-(29,36) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     170                     /* 0x000003B4 07           */ IL_0030: ldloc.1
     171                     /* 0x000003B5 6F1200000A   */ IL_0031: callvirt  instance !0 class [mscorlib]System.Collections.Generic.IEnumerator`1<string>::get_Current()
     172                     /* 0x000003BA 0C           */ IL_0036: stloc.2
     173                     /* (30,17)-(30,18) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     174                     /* 0x000003BB 00           */ IL_0037: nop
     175                     /* (31,21)-(31,96) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     176                     /* 0x000003BC 722D000070   */ IL_0038: ldstr     "read [{0}]: {1}"
     177                     /* 0x000003C1 281D00000A   */ IL_003D: call      class [mscorlib]System.Threading.Thread [mscorlib]System.Threading.Thread::get_CurrentThread()
     178                     /* 0x000003C6 6F1E00000A   */ IL_0042: callvirt  instance int32 [mscorlib]System.Threading.Thread::get_ManagedThreadId()
     179                     /* 0x000003CB 8C20000001   */ IL_0047: box       [mscorlib]System.Int32
     180                     /* 0x000003D0 08           */ IL_004C: ldloc.2
     181                     /* 0x000003D1 282100000A   */ IL_004D: call      string [mscorlib]System.String::Format(string, object, object)
     182                     /* 0x000003D6 282000000A   */ IL_0052: call      void [mscorlib]System.Console::WriteLine(string)
     183                     /* 0x000003DB 00           */ IL_0057: nop
     184                     /* (32,17)-(32,18) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     185                     /* 0x000003DC 00           */ IL_0058: nop
     186 
     187                     /* (29,37)-(29,39) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     188                     /* 0x000003DD 07           */ IL_0059: ldloc.1
     189                     /* 0x000003DE 6F1100000A   */ IL_005A: callvirt  instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
     190                     /* 0x000003E3 2DCF         */ IL_005F: brtrue.s  IL_0030
     191                 // end loop
     192 
     193                 /* 0x000003E5 DE0B         */ IL_0061: leave.s   IL_006E
     194             } // end .try
     195             finally
     196             {
     197                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     198                 /* 0x000003E7 07           */ IL_0063: ldloc.1
     199                 /* 0x000003E8 2C07         */ IL_0064: brfalse.s IL_006D
     200 
     201                 /* 0x000003EA 07           */ IL_0066: ldloc.1
     202                 /* 0x000003EB 6F1000000A   */ IL_0067: callvirt  instance void [mscorlib]System.IDisposable::Dispose()
     203                 /* 0x000003F0 00           */ IL_006C: nop
     204 
     205                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     206                 /* 0x000003F1 DC           */ IL_006D: endfinally
     207             } // end handler
     208 
     209             /* (33,13)-(33,14) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     210             /* 0x000003F2 2A           */ IL_006E: ret
     211         } // end of method '<>c'::'<Main>b__0_1'
     212 
     213     } // end of class <>c
     214 
     215     // Token: 0x02000004 RID: 4
     216     .class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass1_0'
     217         extends [mscorlib]System.Object
     218     {
     219         .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
     220             01 00 00 00
     221         )
     222         // Fields
     223         // Token: 0x04000005 RID: 5
     224         .field public class [System]System.Collections.Concurrent.BlockingCollection`1<string> collection
     225 
     226         // Methods
     227         // Token: 0x06000009 RID: 9 RVA: 0x00002204 File Offset: 0x00000404
     228         .method public hidebysig specialname rtspecialname 
     229             instance void .ctor () cil managed 
     230         {
     231             // Header Size: 1 byte
     232             // Code Size: 8 (0x8) bytes
     233             .maxstack 8
     234 
     235             /* 0x00000405 02           */ IL_0000: ldarg.0
     236             /* 0x00000406 281C00000A   */ IL_0001: call      instance void [mscorlib]System.Object::.ctor()
     237             /* 0x0000040B 00           */ IL_0006: nop
     238             /* 0x0000040C 2A           */ IL_0007: ret
     239         } // end of method '<>c__DisplayClass1_0'::.ctor
     240 
     241         // Token: 0x0600000A RID: 10 RVA: 0x00002210 File Offset: 0x00000410
     242         .method assembly hidebysig 
     243             instance void '<CreateCollection>b__0' () cil managed 
     244         {
     245             // Header Size: 12 bytes
     246             // Code Size: 152 (0x98) bytes
     247             // LocalVarSig Token: 0x11000002 RID: 2
     248             .maxstack 3
     249             .locals init (
     250                 [0] int32 i,
     251                 [1] string 'value',
     252                 [2] bool
     253             )
     254 
     255             /* (46,21)-(46,22) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     256             /* 0x0000041C 00           */ IL_0000: nop
     257             /* (47,25)-(47,60) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     258             /* 0x0000041D 724D000070   */ IL_0001: ldstr     "start new ..."
     259             /* 0x00000422 282000000A   */ IL_0006: call      void [mscorlib]System.Console::WriteLine(string)
     260             /* 0x00000427 00           */ IL_000B: nop
     261             /* (48,30)-(48,39) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     262             /* 0x00000428 16           */ IL_000C: ldc.i4.0
     263             /* 0x00000429 0A           */ IL_000D: stloc.0
     264             /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     265             /* 0x0000042A 2B7B         */ IL_000E: br.s      IL_008B
     266             // loop start (head: IL_008B)
     267                 /* (49,25)-(49,26) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     268                 /* 0x0000042C 00           */ IL_0010: nop
     269                 /* (50,29)-(50,47) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     270                 /* 0x0000042D 1F64         */ IL_0011: ldc.i4.s  100
     271                 /* 0x0000042F 282200000A   */ IL_0013: call      void [mscorlib]System.Threading.Thread::Sleep(int32)
     272                 /* 0x00000434 00           */ IL_0018: nop
     273                 /* (51,29)-(51,58) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     274                 /* 0x00000435 7269000070   */ IL_0019: ldstr     "value: {0}"
     275                 /* 0x0000043A 06           */ IL_001E: ldloc.0
     276                 /* 0x0000043B 8C20000001   */ IL_001F: box       [mscorlib]System.Int32
     277                 /* 0x00000440 281F00000A   */ IL_0024: call      string [mscorlib]System.String::Format(string, object)
     278                 /* 0x00000445 0B           */ IL_0029: stloc.1
     279                 /* (52,29)-(52,107) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     280                 /* 0x00000446 727F000070   */ IL_002A: ldstr     "[{0}] write: {1}"
     281                 /* 0x0000044B 281D00000A   */ IL_002F: call      class [mscorlib]System.Threading.Thread [mscorlib]System.Threading.Thread::get_CurrentThread()
     282                 /* 0x00000450 6F1E00000A   */ IL_0034: callvirt  instance int32 [mscorlib]System.Threading.Thread::get_ManagedThreadId()
     283                 /* 0x00000455 8C20000001   */ IL_0039: box       [mscorlib]System.Int32
     284                 /* 0x0000045A 07           */ IL_003E: ldloc.1
     285                 /* 0x0000045B 282100000A   */ IL_003F: call      string [mscorlib]System.String::Format(string, object, object)
     286                 /* 0x00000460 282000000A   */ IL_0044: call      void [mscorlib]System.Console::WriteLine(string)
     287                 /* 0x00000465 00           */ IL_0049: nop
     288                 /* (53,29)-(53,59) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     289                 /* 0x00000466 02           */ IL_004A: ldarg.0
     290                 /* 0x00000467 7B05000004   */ IL_004B: ldfld     class [System]System.Collections.Concurrent.BlockingCollection`1<string> ConsoleApp1.Program/'<>c__DisplayClass1_0'::collection
     291                 /* 0x0000046C 7269000070   */ IL_0050: ldstr     "value: {0}"
     292                 /* 0x00000471 06           */ IL_0055: ldloc.0
     293                 /* 0x00000472 8C20000001   */ IL_0056: box       [mscorlib]System.Int32
     294                 /* 0x00000477 281F00000A   */ IL_005B: call      string [mscorlib]System.String::Format(string, object)
     295                 /* 0x0000047C 6F2300000A   */ IL_0060: callvirt  instance void class [System]System.Collections.Concurrent.BlockingCollection`1<string>::Add(!0)
     296                 /* 0x00000481 00           */ IL_0065: nop
     297                 /* (54,29)-(54,111) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     298                 /* 0x00000482 72A1000070   */ IL_0066: ldstr     "[{0}] end write: {1}"
     299                 /* 0x00000487 281D00000A   */ IL_006B: call      class [mscorlib]System.Threading.Thread [mscorlib]System.Threading.Thread::get_CurrentThread()
     300                 /* 0x0000048C 6F1E00000A   */ IL_0070: callvirt  instance int32 [mscorlib]System.Threading.Thread::get_ManagedThreadId()
     301                 /* 0x00000491 8C20000001   */ IL_0075: box       [mscorlib]System.Int32
     302                 /* 0x00000496 07           */ IL_007A: ldloc.1
     303                 /* 0x00000497 282100000A   */ IL_007B: call      string [mscorlib]System.String::Format(string, object, object)
     304                 /* 0x0000049C 282000000A   */ IL_0080: call      void [mscorlib]System.Console::WriteLine(string)
     305                 /* 0x000004A1 00           */ IL_0085: nop
     306                 /* (55,25)-(55,26) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     307                 /* 0x000004A2 00           */ IL_0086: nop
     308                 /* (48,49)-(48,52) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     309                 /* 0x000004A3 06           */ IL_0087: ldloc.0
     310                 /* 0x000004A4 17           */ IL_0088: ldc.i4.1
     311                 /* 0x000004A5 58           */ IL_0089: add
     312                 /* 0x000004A6 0A           */ IL_008A: stloc.0
     313 
     314                 /* (48,41)-(48,47) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     315                 /* 0x000004A7 06           */ IL_008B: ldloc.0
     316                 /* 0x000004A8 1F0A         */ IL_008C: ldc.i4.s  10
     317                 /* 0x000004AA FE04         */ IL_008E: clt
     318                 /* 0x000004AC 0C           */ IL_0090: stloc.2
     319                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     320                 /* 0x000004AD 08           */ IL_0091: ldloc.2
     321                 /* 0x000004AE 3A79FFFFFF   */ IL_0092: brtrue    IL_0010
     322             // end loop
     323 
     324             /* (56,21)-(56,22) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     325             /* 0x000004B3 2A           */ IL_0097: ret
     326         } // end of method '<>c__DisplayClass1_0'::'<CreateCollection>b__0'
     327 
     328     } // end of class <>c__DisplayClass1_0
     329 
     330     // Token: 0x02000005 RID: 5
     331     .class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass1_1'
     332         extends [mscorlib]System.Object
     333     {
     334         .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
     335             01 00 00 00
     336         )
     337         // Fields
     338         // Token: 0x04000006 RID: 6
     339         .field public class [mscorlib]System.Exception err
     340         // Token: 0x04000007 RID: 7
     341         .field public class ConsoleApp1.Program/'<>c__DisplayClass1_0' 'CS$<>8__locals1'
     342 
     343         // Methods
     344         // Token: 0x0600000B RID: 11 RVA: 0x000022B4 File Offset: 0x000004B4
     345         .method public hidebysig specialname rtspecialname 
     346             instance void .ctor () cil managed 
     347         {
     348             // Header Size: 1 byte
     349             // Code Size: 8 (0x8) bytes
     350             .maxstack 8
     351 
     352             /* 0x000004B5 02           */ IL_0000: ldarg.0
     353             /* 0x000004B6 281C00000A   */ IL_0001: call      instance void [mscorlib]System.Object::.ctor()
     354             /* 0x000004BB 00           */ IL_0006: nop
     355             /* 0x000004BC 2A           */ IL_0007: ret
     356         } // end of method '<>c__DisplayClass1_1'::.ctor
     357 
     358         // Token: 0x0600000C RID: 12 RVA: 0x000022BD File Offset: 0x000004BD
     359         .method assembly hidebysig 
     360             instance void '<CreateCollection>b__1' (
     361                 class [mscorlib]System.Threading.Tasks.Task task
     362             ) cil managed 
     363         {
     364             // Header Size: 1 byte
     365             // Code Size: 31 (0x1F) bytes
     366             .maxstack 8
     367 
     368             /* (57,21)-(57,22) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     369             /* 0x000004BE 00           */ IL_0000: nop
     370             /* (58,25)-(58,53) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     371             /* 0x000004BF 02           */ IL_0001: ldarg.0
     372             /* 0x000004C0 7B07000004   */ IL_0002: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<>c__DisplayClass1_1'::'CS$<>8__locals1'
     373             /* 0x000004C5 7B05000004   */ IL_0007: ldfld     class [System]System.Collections.Concurrent.BlockingCollection`1<string> ConsoleApp1.Program/'<>c__DisplayClass1_0'::collection
     374             /* 0x000004CA 6F2400000A   */ IL_000C: callvirt  instance void class [System]System.Collections.Concurrent.BlockingCollection`1<string>::CompleteAdding()
     375             /* 0x000004CF 00           */ IL_0011: nop
     376             /* (59,25)-(59,46) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     377             /* 0x000004D0 02           */ IL_0012: ldarg.0
     378             /* 0x000004D1 03           */ IL_0013: ldarg.1
     379             /* 0x000004D2 6F2500000A   */ IL_0014: callvirt  instance class [mscorlib]System.AggregateException [mscorlib]System.Threading.Tasks.Task::get_Exception()
     380             /* 0x000004D7 7D06000004   */ IL_0019: stfld     class [mscorlib]System.Exception ConsoleApp1.Program/'<>c__DisplayClass1_1'::err
     381             /* (60,21)-(60,22) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     382             /* 0x000004DC 2A           */ IL_001E: ret
     383         } // end of method '<>c__DisplayClass1_1'::'<CreateCollection>b__1'
     384 
     385     } // end of class <>c__DisplayClass1_1
     386 
     387     // Token: 0x02000006 RID: 6
     388     .class nested private auto ansi sealed beforefieldinit '<CreateCollection>d__1'
     389         extends [mscorlib]System.Object
     390         implements class [mscorlib]System.Collections.Generic.IEnumerable`1<string>,
     391                    [mscorlib]System.Collections.IEnumerable,
     392                    class [mscorlib]System.Collections.Generic.IEnumerator`1<string>,
     393                    [mscorlib]System.IDisposable,
     394                    [mscorlib]System.Collections.IEnumerator
     395     {
     396         .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
     397             01 00 00 00
     398         )
     399         // Fields
     400         // Token: 0x04000008 RID: 8
     401         .field private int32 '<>1__state'
     402         // Token: 0x04000009 RID: 9
     403         .field private string '<>2__current'
     404         // Token: 0x0400000A RID: 10
     405         .field private int32 '<>l__initialThreadId'
     406         // Token: 0x0400000B RID: 11
     407         .field private class ConsoleApp1.Program/'<>c__DisplayClass1_0' '<>8__1'
     408         // Token: 0x0400000C RID: 12
     409         .field private object '<>s__2'
     410         // Token: 0x0400000D RID: 13
     411         .field private bool '<>s__3'
     412         // Token: 0x0400000E RID: 14
     413         .field private class ConsoleApp1.Program/'<>c__DisplayClass1_1' '<>8__4'
     414         // Token: 0x0400000F RID: 15
     415         .field private class [mscorlib]System.Collections.Generic.IEnumerator`1<string> '<>s__5'
     416         // Token: 0x04000010 RID: 16
     417         .field private string '<item>5__6'
     418 
     419         // Methods
     420         // Token: 0x0600000D RID: 13 RVA: 0x000022DD File Offset: 0x000004DD
     421         .method public hidebysig specialname rtspecialname 
     422             instance void .ctor (
     423                 int32 '<>1__state'
     424             ) cil managed 
     425         {
     426             .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
     427                 01 00 00 00
     428             )
     429             // Header Size: 1 byte
     430             // Code Size: 31 (0x1F) bytes
     431             .maxstack 8
     432 
     433             /* 0x000004DE 02           */ IL_0000: ldarg.0
     434             /* 0x000004DF 281C00000A   */ IL_0001: call      instance void [mscorlib]System.Object::.ctor()
     435             /* 0x000004E4 00           */ IL_0006: nop
     436             /* 0x000004E5 02           */ IL_0007: ldarg.0
     437             /* 0x000004E6 03           */ IL_0008: ldarg.1
     438             /* 0x000004E7 7D08000004   */ IL_0009: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
     439             /* 0x000004EC 02           */ IL_000E: ldarg.0
     440             /* 0x000004ED 281D00000A   */ IL_000F: call      class [mscorlib]System.Threading.Thread [mscorlib]System.Threading.Thread::get_CurrentThread()
     441             /* 0x000004F2 6F1E00000A   */ IL_0014: callvirt  instance int32 [mscorlib]System.Threading.Thread::get_ManagedThreadId()
     442             /* 0x000004F7 7D0A000004   */ IL_0019: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>l__initialThreadId'
     443             /* 0x000004FC 2A           */ IL_001E: ret
     444         } // end of method '<CreateCollection>d__1'::.ctor
     445 
     446         // Token: 0x0600000E RID: 14 RVA: 0x00002300 File Offset: 0x00000500
     447         .method private final hidebysig newslot virtual 
     448             instance void System.IDisposable.Dispose () cil managed 
     449         {
     450             .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
     451                 01 00 00 00
     452             )
     453             .override method instance void [mscorlib]System.IDisposable::Dispose()
     454             // Header Size: 12 bytes
     455             // Code Size: 87 (0x57) bytes
     456             // LocalVarSig Token: 0x11000003 RID: 3
     457             .maxstack 2
     458             .locals init (
     459                 [0] int32
     460             )
     461 
     462             /* 0x0000050C 02           */ IL_0000: ldarg.0
     463             /* 0x0000050D 7B08000004   */ IL_0001: ldfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
     464             /* 0x00000512 0A           */ IL_0006: stloc.0
     465             /* 0x00000513 06           */ IL_0007: ldloc.0
     466             /* 0x00000514 1FFB         */ IL_0008: ldc.i4.s  -5
     467             /* 0x00000516 59           */ IL_000A: sub
     468             /* 0x00000517 18           */ IL_000B: ldc.i4.2
     469             /* 0x00000518 3608         */ IL_000C: ble.un.s  IL_0016
     470 
     471             /* 0x0000051A 2B00         */ IL_000E: br.s      IL_0010
     472 
     473             /* 0x0000051C 06           */ IL_0010: ldloc.0
     474             /* 0x0000051D 17           */ IL_0011: ldc.i4.1
     475             /* 0x0000051E 2E02         */ IL_0012: beq.s     IL_0016
     476 
     477             /* 0x00000520 2B40         */ IL_0014: br.s      IL_0056
     478 
     479             /* 0x00000522 00           */ IL_0016: nop
     480             .try
     481             {
     482                 /* 0x00000523 06           */ IL_0017: ldloc.0
     483                 /* 0x00000524 1FFB         */ IL_0018: ldc.i4.s  -5
     484                 /* 0x00000526 59           */ IL_001A: sub
     485                 /* 0x00000527 17           */ IL_001B: ldc.i4.1
     486                 /* 0x00000528 3608         */ IL_001C: ble.un.s  IL_0026
     487 
     488                 /* 0x0000052A 2B00         */ IL_001E: br.s      IL_0020
     489 
     490                 /* 0x0000052C 06           */ IL_0020: ldloc.0
     491                 /* 0x0000052D 17           */ IL_0021: ldc.i4.1
     492                 /* 0x0000052E 2E02         */ IL_0022: beq.s     IL_0026
     493 
     494                 /* 0x00000530 2B25         */ IL_0024: br.s      IL_004B
     495 
     496                 /* 0x00000532 00           */ IL_0026: nop
     497                 .try
     498                 {
     499                     /* 0x00000533 06           */ IL_0027: ldloc.0
     500                     /* 0x00000534 1FFB         */ IL_0028: ldc.i4.s  -5
     501                     /* 0x00000536 2E08         */ IL_002A: beq.s     IL_0034
     502 
     503                     /* 0x00000538 2B00         */ IL_002C: br.s      IL_002E
     504 
     505                     /* 0x0000053A 06           */ IL_002E: ldloc.0
     506                     /* 0x0000053B 17           */ IL_002F: ldc.i4.1
     507                     /* 0x0000053C 2E02         */ IL_0030: beq.s     IL_0034
     508 
     509                     /* 0x0000053E 2B0C         */ IL_0032: br.s      IL_0040
     510 
     511                     /* 0x00000540 00           */ IL_0034: nop
     512                     .try
     513                     {
     514                         /* 0x00000541 DE07         */ IL_0035: leave.s   IL_003E
     515                     } // end .try
     516                     finally
     517                     {
     518                         /* 0x00000543 02           */ IL_0037: ldarg.0
     519                         /* 0x00000544 2812000006   */ IL_0038: call      instance void ConsoleApp1.Program/'<CreateCollection>d__1'::'<>m__Finally3'()
     520                         /* 0x00000549 DC           */ IL_003D: endfinally
     521                     } // end handler
     522 
     523                     /* 0x0000054A 2B00         */ IL_003E: br.s      IL_0040
     524 
     525                     /* 0x0000054C DE07         */ IL_0040: leave.s   IL_0049
     526                 } // end .try
     527                 finally
     528                 {
     529                     /* 0x0000054E 02           */ IL_0042: ldarg.0
     530                     /* 0x0000054F 2811000006   */ IL_0043: call      instance void ConsoleApp1.Program/'<CreateCollection>d__1'::'<>m__Finally2'()
     531                     /* 0x00000554 DC           */ IL_0048: endfinally
     532                 } // end handler
     533 
     534                 /* 0x00000555 2B00         */ IL_0049: br.s      IL_004B
     535 
     536                 /* 0x00000557 DE07         */ IL_004B: leave.s   IL_0054
     537             } // end .try
     538             finally
     539             {
     540                 /* 0x00000559 02           */ IL_004D: ldarg.0
     541                 /* 0x0000055A 2810000006   */ IL_004E: call      instance void ConsoleApp1.Program/'<CreateCollection>d__1'::'<>m__Finally1'()
     542                 /* 0x0000055F DC           */ IL_0053: endfinally
     543             } // end handler
     544 
     545             /* 0x00000560 2B00         */ IL_0054: br.s      IL_0056
     546 
     547             /* 0x00000562 2A           */ IL_0056: ret
     548         } // end of method '<CreateCollection>d__1'::System.IDisposable.Dispose
     549 
     550         // Token: 0x0600000F RID: 15 RVA: 0x0000238C File Offset: 0x0000058C
     551         .method private final hidebysig newslot virtual 
     552             instance bool MoveNext () cil managed 
     553         {
     554             .override method instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
     555             // Header Size: 12 bytes
     556             // Code Size: 394 (0x18A) bytes
     557             // LocalVarSig Token: 0x11000004 RID: 4
     558             .maxstack 3
     559             .locals init (
     560                 [0] bool,
     561                 [1] int32
     562             )
     563 
     564             .try
     565             {
     566                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     567                 /* 0x00000598 02           */ IL_0000: ldarg.0
     568                 /* 0x00000599 7B08000004   */ IL_0001: ldfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
     569                 /* 0x0000059E 0B           */ IL_0006: stloc.1
     570                 /* 0x0000059F 07           */ IL_0007: ldloc.1
     571                 /* 0x000005A0 2C08         */ IL_0008: brfalse.s IL_0012
     572 
     573                 /* 0x000005A2 2B00         */ IL_000A: br.s      IL_000C
     574 
     575                 /* 0x000005A4 07           */ IL_000C: ldloc.1
     576                 /* 0x000005A5 17           */ IL_000D: ldc.i4.1
     577                 /* 0x000005A6 2E04         */ IL_000E: beq.s     IL_0014
     578 
     579                 /* 0x000005A8 2B07         */ IL_0010: br.s      IL_0019
     580 
     581                 /* 0x000005AA 2B0C         */ IL_0012: br.s      IL_0020
     582 
     583                 /* 0x000005AC 3813010000   */ IL_0014: br        IL_012C
     584 
     585                 /* 0x000005B1 16           */ IL_0019: ldc.i4.0
     586                 /* 0x000005B2 0A           */ IL_001A: stloc.0
     587                 /* 0x000005B3 DD68010000   */ IL_001B: leave     IL_0188
     588 
     589                 /* 0x000005B8 02           */ IL_0020: ldarg.0
     590                 /* 0x000005B9 15           */ IL_0021: ldc.i4.m1
     591                 /* 0x000005BA 7D08000004   */ IL_0022: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
     592                 /* (39,9)-(39,10) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     593                 /* 0x000005BF 00           */ IL_0027: nop
     594                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     595                 /* 0x000005C0 02           */ IL_0028: ldarg.0
     596                 /* 0x000005C1 7309000006   */ IL_0029: newobj    instance void ConsoleApp1.Program/'<>c__DisplayClass1_0'::.ctor()
     597                 /* 0x000005C6 7D0B000004   */ IL_002E: stfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__1'
     598                 /* (40,20)-(40,92) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     599                 /* 0x000005CB 02           */ IL_0033: ldarg.0
     600                 /* 0x000005CC 7B0B000004   */ IL_0034: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__1'
     601                 /* 0x000005D1 732600000A   */ IL_0039: newobj    instance void class [System]System.Collections.Concurrent.BlockingCollection`1<string>::.ctor()
     602                 /* 0x000005D6 7D05000004   */ IL_003E: stfld     class [System]System.Collections.Concurrent.BlockingCollection`1<string> ConsoleApp1.Program/'<>c__DisplayClass1_0'::collection
     603                 /* 0x000005DB 02           */ IL_0043: ldarg.0
     604                 /* 0x000005DC 1FFD         */ IL_0044: ldc.i4.s  -3
     605                 /* 0x000005DE 7D08000004   */ IL_0046: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
     606                 /* (41,13)-(41,14) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     607                 /* 0x000005E3 00           */ IL_004B: nop
     608                 /* (42,17)-(42,34) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     609                 /* 0x000005E4 02           */ IL_004C: ldarg.0
     610                 /* 0x000005E5 7E01000004   */ IL_004D: ldsfld    object ConsoleApp1.Program::globalLock
     611                 /* 0x000005EA 7D0C000004   */ IL_0052: stfld     object ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__2'
     612                 /* 0x000005EF 02           */ IL_0057: ldarg.0
     613                 /* 0x000005F0 16           */ IL_0058: ldc.i4.0
     614                 /* 0x000005F1 7D0D000004   */ IL_0059: stfld     bool ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__3'
     615                 /* 0x000005F6 02           */ IL_005E: ldarg.0
     616                 /* 0x000005F7 1FFC         */ IL_005F: ldc.i4.s  -4
     617                 /* 0x000005F9 7D08000004   */ IL_0061: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
     618                 /* 0x000005FE 02           */ IL_0066: ldarg.0
     619                 /* 0x000005FF 7B0C000004   */ IL_0067: ldfld     object ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__2'
     620                 /* 0x00000604 02           */ IL_006C: ldarg.0
     621                 /* 0x00000605 7C0D000004   */ IL_006D: ldflda    bool ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__3'
     622                 /* 0x0000060A 282700000A   */ IL_0072: call      void [mscorlib]System.Threading.Monitor::Enter(object, bool&)
     623                 /* 0x0000060F 00           */ IL_0077: nop
     624                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     625                 /* 0x00000610 02           */ IL_0078: ldarg.0
     626                 /* 0x00000611 730B000006   */ IL_0079: newobj    instance void ConsoleApp1.Program/'<>c__DisplayClass1_1'::.ctor()
     627                 /* 0x00000616 7D0E000004   */ IL_007E: stfld     class ConsoleApp1.Program/'<>c__DisplayClass1_1' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__4'
     628                 /* 0x0000061B 02           */ IL_0083: ldarg.0
     629                 /* 0x0000061C 7B0E000004   */ IL_0084: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_1' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__4'
     630                 /* 0x00000621 02           */ IL_0089: ldarg.0
     631                 /* 0x00000622 7B0B000004   */ IL_008A: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__1'
     632                 /* 0x00000627 7D07000004   */ IL_008F: stfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<>c__DisplayClass1_1'::'CS$<>8__locals1'
     633                 /* (43,17)-(43,18) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     634                 /* 0x0000062C 00           */ IL_0094: nop
     635                 /* (44,21)-(44,42) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     636                 /* 0x0000062D 02           */ IL_0095: ldarg.0
     637                 /* 0x0000062E 7B0E000004   */ IL_0096: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_1' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__4'
     638                 /* 0x00000633 14           */ IL_009B: ldnull
     639                 /* 0x00000634 7D06000004   */ IL_009C: stfld     class [mscorlib]System.Exception ConsoleApp1.Program/'<>c__DisplayClass1_1'::err
     640                 /* (45,21)-(60,24) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     641                 /* 0x00000639 281800000A   */ IL_00A1: call      class [mscorlib]System.Threading.Tasks.TaskFactory [mscorlib]System.Threading.Tasks.Task::get_Factory()
     642                 /* 0x0000063E 02           */ IL_00A6: ldarg.0
     643                 /* 0x0000063F 7B0E000004   */ IL_00A7: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_1' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__4'
     644                 /* 0x00000644 7B07000004   */ IL_00AC: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<>c__DisplayClass1_1'::'CS$<>8__locals1'
     645                 /* 0x00000649 FE060A000006 */ IL_00B1: ldftn     instance void ConsoleApp1.Program/'<>c__DisplayClass1_0'::'<CreateCollection>b__0'()
     646                 /* 0x0000064F 731900000A   */ IL_00B7: newobj    instance void [mscorlib]System.Action::.ctor(object, native int)
     647                 /* 0x00000654 6F1A00000A   */ IL_00BC: callvirt  instance class [mscorlib]System.Threading.Tasks.Task [mscorlib]System.Threading.Tasks.TaskFactory::StartNew(class [mscorlib]System.Action)
     648                 /* 0x00000659 02           */ IL_00C1: ldarg.0
     649                 /* 0x0000065A 7B0E000004   */ IL_00C2: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_1' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__4'
     650                 /* 0x0000065F FE060C000006 */ IL_00C7: ldftn     instance void ConsoleApp1.Program/'<>c__DisplayClass1_1'::'<CreateCollection>b__1'(class [mscorlib]System.Threading.Tasks.Task)
     651                 /* 0x00000665 732800000A   */ IL_00CD: newobj    instance void class [mscorlib]System.Action`1<class [mscorlib]System.Threading.Tasks.Task>::.ctor(object, native int)
     652                 /* 0x0000066A 6F2900000A   */ IL_00D2: callvirt  instance class [mscorlib]System.Threading.Tasks.Task [mscorlib]System.Threading.Tasks.Task::ContinueWith(class [mscorlib]System.Action`1<class [mscorlib]System.Threading.Tasks.Task>)
     653                 /* 0x0000066F 26           */ IL_00D7: pop
     654                 /* (62,21)-(62,28) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     655                 /* 0x00000670 00           */ IL_00D8: nop
     656                 /* (62,45)-(62,80) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     657                 /* 0x00000671 02           */ IL_00D9: ldarg.0
     658                 /* 0x00000672 02           */ IL_00DA: ldarg.0
     659                 /* 0x00000673 7B0E000004   */ IL_00DB: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_1' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__4'
     660                 /* 0x00000678 7B07000004   */ IL_00E0: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<>c__DisplayClass1_1'::'CS$<>8__locals1'
     661                 /* 0x0000067D 7B05000004   */ IL_00E5: ldfld     class [System]System.Collections.Concurrent.BlockingCollection`1<string> ConsoleApp1.Program/'<>c__DisplayClass1_0'::collection
     662                 /* 0x00000682 6F2A00000A   */ IL_00EA: callvirt  instance class [mscorlib]System.Collections.Generic.IEnumerable`1<!0> class [System]System.Collections.Concurrent.BlockingCollection`1<string>::GetConsumingEnumerable()
     663                 /* 0x00000687 6F1500000A   */ IL_00EF: callvirt  instance class [mscorlib]System.Collections.Generic.IEnumerator`1<!0> class [mscorlib]System.Collections.Generic.IEnumerable`1<string>::GetEnumerator()
     664                 /* 0x0000068C 7D0F000004   */ IL_00F4: stfld     class [mscorlib]System.Collections.Generic.IEnumerator`1<string> ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__5'
     665                 /* 0x00000691 02           */ IL_00F9: ldarg.0
     666                 /* 0x00000692 1FFB         */ IL_00FA: ldc.i4.s  -5
     667                 /* 0x00000694 7D08000004   */ IL_00FC: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
     668                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     669                 /* 0x00000699 2B39         */ IL_0101: br.s      IL_013C
     670 
     671                 /* (62,30)-(62,41) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     672                 /* 0x0000069B 02           */ IL_0103: ldarg.0
     673                 /* 0x0000069C 02           */ IL_0104: ldarg.0
     674                 /* 0x0000069D 7B0F000004   */ IL_0105: ldfld     class [mscorlib]System.Collections.Generic.IEnumerator`1<string> ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__5'
     675                 /* 0x000006A2 6F1200000A   */ IL_010A: callvirt  instance !0 class [mscorlib]System.Collections.Generic.IEnumerator`1<string>::get_Current()
     676                 /* 0x000006A7 7D10000004   */ IL_010F: stfld     string ConsoleApp1.Program/'<CreateCollection>d__1'::'<item>5__6'
     677                 /* (63,21)-(63,22) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     678                 /* 0x000006AC 00           */ IL_0114: nop
     679                 /* (64,25)-(64,43) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     680                 /* 0x000006AD 02           */ IL_0115: ldarg.0
     681                 /* 0x000006AE 02           */ IL_0116: ldarg.0
     682                 /* 0x000006AF 7B10000004   */ IL_0117: ldfld     string ConsoleApp1.Program/'<CreateCollection>d__1'::'<item>5__6'
     683                 /* 0x000006B4 7D09000004   */ IL_011C: stfld     string ConsoleApp1.Program/'<CreateCollection>d__1'::'<>2__current'
     684                 /* 0x000006B9 02           */ IL_0121: ldarg.0
     685                 /* 0x000006BA 17           */ IL_0122: ldc.i4.1
     686                 /* 0x000006BB 7D08000004   */ IL_0123: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
     687                 /* 0x000006C0 17           */ IL_0128: ldc.i4.1
     688                 /* 0x000006C1 0A           */ IL_0129: stloc.0
     689                 /* 0x000006C2 DE5C         */ IL_012A: leave.s   IL_0188
     690 
     691                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     692                 /* 0x000006C4 02           */ IL_012C: ldarg.0
     693                 /* 0x000006C5 1FFB         */ IL_012D: ldc.i4.s  -5
     694                 /* 0x000006C7 7D08000004   */ IL_012F: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
     695                 /* (65,21)-(65,22) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     696                 /* 0x000006CC 00           */ IL_0134: nop
     697                 /* 0x000006CD 02           */ IL_0135: ldarg.0
     698                 /* 0x000006CE 14           */ IL_0136: ldnull
     699                 /* 0x000006CF 7D10000004   */ IL_0137: stfld     string ConsoleApp1.Program/'<CreateCollection>d__1'::'<item>5__6'
     700 
     701                 /* (62,42)-(62,44) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     702                 /* 0x000006D4 02           */ IL_013C: ldarg.0
     703                 /* 0x000006D5 7B0F000004   */ IL_013D: ldfld     class [mscorlib]System.Collections.Generic.IEnumerator`1<string> ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__5'
     704                 /* 0x000006DA 6F1100000A   */ IL_0142: callvirt  instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
     705                 /* 0x000006DF 2DBA         */ IL_0147: brtrue.s  IL_0103
     706 
     707                 /* 0x000006E1 02           */ IL_0149: ldarg.0
     708                 /* 0x000006E2 2812000006   */ IL_014A: call      instance void ConsoleApp1.Program/'<CreateCollection>d__1'::'<>m__Finally3'()
     709                 /* 0x000006E7 00           */ IL_014F: nop
     710                 /* 0x000006E8 02           */ IL_0150: ldarg.0
     711                 /* 0x000006E9 14           */ IL_0151: ldnull
     712                 /* 0x000006EA 7D0F000004   */ IL_0152: stfld     class [mscorlib]System.Collections.Generic.IEnumerator`1<string> ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__5'
     713                 /* (66,17)-(66,18) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     714                 /* 0x000006EF 00           */ IL_0157: nop
     715                 /* 0x000006F0 02           */ IL_0158: ldarg.0
     716                 /* 0x000006F1 14           */ IL_0159: ldnull
     717                 /* 0x000006F2 7D0E000004   */ IL_015A: stfld     class ConsoleApp1.Program/'<>c__DisplayClass1_1' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__4'
     718                 /* 0x000006F7 02           */ IL_015F: ldarg.0
     719                 /* 0x000006F8 2811000006   */ IL_0160: call      instance void ConsoleApp1.Program/'<CreateCollection>d__1'::'<>m__Finally2'()
     720                 /* 0x000006FD 00           */ IL_0165: nop
     721                 /* 0x000006FE 02           */ IL_0166: ldarg.0
     722                 /* 0x000006FF 14           */ IL_0167: ldnull
     723                 /* 0x00000700 7D0C000004   */ IL_0168: stfld     object ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__2'
     724                 /* (67,13)-(67,14) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     725                 /* 0x00000705 00           */ IL_016D: nop
     726                 /* 0x00000706 02           */ IL_016E: ldarg.0
     727                 /* 0x00000707 2810000006   */ IL_016F: call      instance void ConsoleApp1.Program/'<CreateCollection>d__1'::'<>m__Finally1'()
     728                 /* 0x0000070C 00           */ IL_0174: nop
     729                 /* 0x0000070D 02           */ IL_0175: ldarg.0
     730                 /* 0x0000070E 14           */ IL_0176: ldnull
     731                 /* 0x0000070F 7D0B000004   */ IL_0177: stfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__1'
     732                 /* (68,9)-(68,10) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     733                 /* 0x00000714 16           */ IL_017C: ldc.i4.0
     734                 /* 0x00000715 0A           */ IL_017D: stloc.0
     735                 /* 0x00000716 DE08         */ IL_017E: leave.s   IL_0188
     736             } // end .try
     737             fault
     738             {
     739                 /* (hidden)-(hidden) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     740                 /* 0x00000718 02           */ IL_0180: ldarg.0
     741                 /* 0x00000719 280E000006   */ IL_0181: call      instance void ConsoleApp1.Program/'<CreateCollection>d__1'::System.IDisposable.Dispose()
     742                 /* 0x0000071E 00           */ IL_0186: nop
     743                 /* 0x0000071F DC           */ IL_0187: endfinally
     744             } // end handler
     745 
     746             /* 0x00000720 06           */ IL_0188: ldloc.0
     747             /* 0x00000721 2A           */ IL_0189: ret
     748         } // end of method '<CreateCollection>d__1'::MoveNext
     749 
     750         // Token: 0x06000010 RID: 16 RVA: 0x00002540 File Offset: 0x00000740
     751         .method private hidebysig 
     752             instance void '<>m__Finally1' () cil managed 
     753         {
     754             // Header Size: 1 byte
     755             // Code Size: 38 (0x26) bytes
     756             .maxstack 8
     757 
     758             /* 0x00000741 02           */ IL_0000: ldarg.0
     759             /* 0x00000742 15           */ IL_0001: ldc.i4.m1
     760             /* 0x00000743 7D08000004   */ IL_0002: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
     761             /* 0x00000748 02           */ IL_0007: ldarg.0
     762             /* 0x00000749 7B0B000004   */ IL_0008: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__1'
     763             /* 0x0000074E 7B05000004   */ IL_000D: ldfld     class [System]System.Collections.Concurrent.BlockingCollection`1<string> ConsoleApp1.Program/'<>c__DisplayClass1_0'::collection
     764             /* 0x00000753 2C11         */ IL_0012: brfalse.s IL_0025
     765 
     766             /* 0x00000755 02           */ IL_0014: ldarg.0
     767             /* 0x00000756 7B0B000004   */ IL_0015: ldfld     class ConsoleApp1.Program/'<>c__DisplayClass1_0' ConsoleApp1.Program/'<CreateCollection>d__1'::'<>8__1'
     768             /* 0x0000075B 7B05000004   */ IL_001A: ldfld     class [System]System.Collections.Concurrent.BlockingCollection`1<string> ConsoleApp1.Program/'<>c__DisplayClass1_0'::collection
     769             /* 0x00000760 6F1000000A   */ IL_001F: callvirt  instance void [mscorlib]System.IDisposable::Dispose()
     770             /* 0x00000765 00           */ IL_0024: nop
     771 
     772             /* 0x00000766 2A           */ IL_0025: ret
     773         } // end of method '<CreateCollection>d__1'::'<>m__Finally1'
     774 
     775         // Token: 0x06000011 RID: 17 RVA: 0x00002567 File Offset: 0x00000767
     776         .method private hidebysig 
     777             instance void '<>m__Finally2' () cil managed 
     778         {
     779             // Header Size: 1 byte
     780             // Code Size: 29 (0x1D) bytes
     781             .maxstack 8
     782 
     783             /* 0x00000768 02           */ IL_0000: ldarg.0
     784             /* 0x00000769 1FFD         */ IL_0001: ldc.i4.s  -3
     785             /* 0x0000076B 7D08000004   */ IL_0003: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
     786             /* 0x00000770 02           */ IL_0008: ldarg.0
     787             /* 0x00000771 7B0D000004   */ IL_0009: ldfld     bool ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__3'
     788             /* 0x00000776 2C0C         */ IL_000E: brfalse.s IL_001C
     789 
     790             /* 0x00000778 02           */ IL_0010: ldarg.0
     791             /* 0x00000779 7B0C000004   */ IL_0011: ldfld     object ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__2'
     792             /* 0x0000077E 282B00000A   */ IL_0016: call      void [mscorlib]System.Threading.Monitor::Exit(object)
     793             /* 0x00000783 00           */ IL_001B: nop
     794 
     795             /* 0x00000784 2A           */ IL_001C: ret
     796         } // end of method '<CreateCollection>d__1'::'<>m__Finally2'
     797 
     798         // Token: 0x06000012 RID: 18 RVA: 0x00002585 File Offset: 0x00000785
     799         .method private hidebysig 
     800             instance void '<>m__Finally3' () cil managed 
     801         {
     802             // Header Size: 1 byte
     803             // Code Size: 29 (0x1D) bytes
     804             .maxstack 8
     805 
     806             /* 0x00000786 02           */ IL_0000: ldarg.0
     807             /* 0x00000787 1FFC         */ IL_0001: ldc.i4.s  -4
     808             /* 0x00000789 7D08000004   */ IL_0003: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
     809             /* 0x0000078E 02           */ IL_0008: ldarg.0
     810             /* 0x0000078F 7B0F000004   */ IL_0009: ldfld     class [mscorlib]System.Collections.Generic.IEnumerator`1<string> ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__5'
     811             /* 0x00000794 2C0C         */ IL_000E: brfalse.s IL_001C
     812 
     813             /* 0x00000796 02           */ IL_0010: ldarg.0
     814             /* 0x00000797 7B0F000004   */ IL_0011: ldfld     class [mscorlib]System.Collections.Generic.IEnumerator`1<string> ConsoleApp1.Program/'<CreateCollection>d__1'::'<>s__5'
     815             /* 0x0000079C 6F1000000A   */ IL_0016: callvirt  instance void [mscorlib]System.IDisposable::Dispose()
     816             /* 0x000007A1 00           */ IL_001B: nop
     817 
     818             /* 0x000007A2 2A           */ IL_001C: ret
     819         } // end of method '<CreateCollection>d__1'::'<>m__Finally3'
     820 
     821         // Token: 0x06000013 RID: 19 RVA: 0x000025A3 File Offset: 0x000007A3
     822         .method private final hidebysig specialname newslot virtual 
     823             instance string 'System.Collections.Generic.IEnumerator<System.String>.get_Current' () cil managed 
     824         {
     825             .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
     826                 01 00 00 00
     827             )
     828             .override method instance !0 class [mscorlib]System.Collections.Generic.IEnumerator`1<string>::get_Current()
     829             // Header Size: 1 byte
     830             // Code Size: 7 (0x7) bytes
     831             .maxstack 8
     832 
     833             /* 0x000007A4 02           */ IL_0000: ldarg.0
     834             /* 0x000007A5 7B09000004   */ IL_0001: ldfld     string ConsoleApp1.Program/'<CreateCollection>d__1'::'<>2__current'
     835             /* 0x000007AA 2A           */ IL_0006: ret
     836         } // end of method '<CreateCollection>d__1'::'System.Collections.Generic.IEnumerator<System.String>.get_Current'
     837 
     838         // Token: 0x06000014 RID: 20 RVA: 0x000025AB File Offset: 0x000007AB
     839         .method private final hidebysig newslot virtual 
     840             instance void System.Collections.IEnumerator.Reset () cil managed 
     841         {
     842             .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
     843                 01 00 00 00
     844             )
     845             .override method instance void [mscorlib]System.Collections.IEnumerator::Reset()
     846             // Header Size: 1 byte
     847             // Code Size: 6 (0x6) bytes
     848             .maxstack 8
     849 
     850             /* 0x000007AC 732C00000A   */ IL_0000: newobj    instance void [mscorlib]System.NotSupportedException::.ctor()
     851             /* 0x000007B1 7A           */ IL_0005: throw
     852         } // end of method '<CreateCollection>d__1'::System.Collections.IEnumerator.Reset
     853 
     854         // Token: 0x06000015 RID: 21 RVA: 0x000025B2 File Offset: 0x000007B2
     855         .method private final hidebysig specialname newslot virtual 
     856             instance object System.Collections.IEnumerator.get_Current () cil managed 
     857         {
     858             .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
     859                 01 00 00 00
     860             )
     861             .override method instance object [mscorlib]System.Collections.IEnumerator::get_Current()
     862             // Header Size: 1 byte
     863             // Code Size: 7 (0x7) bytes
     864             .maxstack 8
     865 
     866             /* 0x000007B3 02           */ IL_0000: ldarg.0
     867             /* 0x000007B4 7B09000004   */ IL_0001: ldfld     string ConsoleApp1.Program/'<CreateCollection>d__1'::'<>2__current'
     868             /* 0x000007B9 2A           */ IL_0006: ret
     869         } // end of method '<CreateCollection>d__1'::System.Collections.IEnumerator.get_Current
     870 
     871         // Token: 0x06000016 RID: 22 RVA: 0x000025BC File Offset: 0x000007BC
     872         .method private final hidebysig newslot virtual 
     873             instance class [mscorlib]System.Collections.Generic.IEnumerator`1<string> 'System.Collections.Generic.IEnumerable<System.String>.GetEnumerator' () cil managed 
     874         {
     875             .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
     876                 01 00 00 00
     877             )
     878             .override method instance class [mscorlib]System.Collections.Generic.IEnumerator`1<!0> class [mscorlib]System.Collections.Generic.IEnumerable`1<string>::GetEnumerator()
     879             // Header Size: 12 bytes
     880             // Code Size: 48 (0x30) bytes
     881             // LocalVarSig Token: 0x11000005 RID: 5
     882             .maxstack 2
     883             .locals init (
     884                 [0] class ConsoleApp1.Program/'<CreateCollection>d__1'
     885             )
     886 
     887             /* 0x000007C8 02           */ IL_0000: ldarg.0
     888             /* 0x000007C9 7B08000004   */ IL_0001: ldfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
     889             /* 0x000007CE 1FFE         */ IL_0006: ldc.i4.s  -2
     890             /* 0x000007D0 331D         */ IL_0008: bne.un.s  IL_0027
     891 
     892             /* 0x000007D2 02           */ IL_000A: ldarg.0
     893             /* 0x000007D3 7B0A000004   */ IL_000B: ldfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>l__initialThreadId'
     894             /* 0x000007D8 281D00000A   */ IL_0010: call      class [mscorlib]System.Threading.Thread [mscorlib]System.Threading.Thread::get_CurrentThread()
     895             /* 0x000007DD 6F1E00000A   */ IL_0015: callvirt  instance int32 [mscorlib]System.Threading.Thread::get_ManagedThreadId()
     896             /* 0x000007E2 330B         */ IL_001A: bne.un.s  IL_0027
     897 
     898             /* 0x000007E4 02           */ IL_001C: ldarg.0
     899             /* 0x000007E5 16           */ IL_001D: ldc.i4.0
     900             /* 0x000007E6 7D08000004   */ IL_001E: stfld     int32 ConsoleApp1.Program/'<CreateCollection>d__1'::'<>1__state'
     901             /* 0x000007EB 02           */ IL_0023: ldarg.0
     902             /* 0x000007EC 0A           */ IL_0024: stloc.0
     903             /* 0x000007ED 2B07         */ IL_0025: br.s      IL_002E
     904 
     905             /* 0x000007EF 16           */ IL_0027: ldc.i4.0
     906             /* 0x000007F0 730D000006   */ IL_0028: newobj    instance void ConsoleApp1.Program/'<CreateCollection>d__1'::.ctor(int32)
     907             /* 0x000007F5 0A           */ IL_002D: stloc.0
     908 
     909             /* 0x000007F6 06           */ IL_002E: ldloc.0
     910             /* 0x000007F7 2A           */ IL_002F: ret
     911         } // end of method '<CreateCollection>d__1'::'System.Collections.Generic.IEnumerable<System.String>.GetEnumerator'
     912 
     913         // Token: 0x06000017 RID: 23 RVA: 0x000025F8 File Offset: 0x000007F8
     914         .method private final hidebysig newslot virtual 
     915             instance class [mscorlib]System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () cil managed 
     916         {
     917             .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = (
     918                 01 00 00 00
     919             )
     920             .override method instance class [mscorlib]System.Collections.IEnumerator [mscorlib]System.Collections.IEnumerable::GetEnumerator()
     921             // Header Size: 1 byte
     922             // Code Size: 7 (0x7) bytes
     923             .maxstack 8
     924 
     925             /* 0x000007F9 02           */ IL_0000: ldarg.0
     926             /* 0x000007FA 2816000006   */ IL_0001: call      instance class [mscorlib]System.Collections.Generic.IEnumerator`1<string> ConsoleApp1.Program/'<CreateCollection>d__1'::'System.Collections.Generic.IEnumerable<System.String>.GetEnumerator'()
     927             /* 0x000007FF 2A           */ IL_0006: ret
     928         } // end of method '<CreateCollection>d__1'::System.Collections.IEnumerable.GetEnumerator
     929 
     930         // Properties
     931         // Token: 0x17000001 RID: 1
     932         .property instance string 'System.Collections.Generic.IEnumerator<System.String>.Current'()
     933         {
     934             // Token: 0x06000013 RID: 19 RVA: 0x000025A3 File Offset: 0x000007A3
     935             .get instance string ConsoleApp1.Program/'<CreateCollection>d__1'::'System.Collections.Generic.IEnumerator<System.String>.get_Current'()
     936         }
     937         // Token: 0x17000002 RID: 2
     938         .property instance object System.Collections.IEnumerator.Current()
     939         {
     940             // Token: 0x06000015 RID: 21 RVA: 0x000025B2 File Offset: 0x000007B2
     941             .get instance object ConsoleApp1.Program/'<CreateCollection>d__1'::System.Collections.IEnumerator.get_Current()
     942         }
     943 
     944     } // end of class <CreateCollection>d__1
     945 
     946 
     947     // Fields
     948     // Token: 0x04000001 RID: 1
     949     .field private static initonly object globalLock
     950 
     951     // Methods
     952     // Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
     953     .method public hidebysig static 
     954         void Main (
     955             string[] args
     956         ) cil managed 
     957     {
     958         // Header Size: 12 bytes
     959         // Code Size: 92 (0x5C) bytes
     960         .maxstack 3
     961         .entrypoint
     962 
     963         /* (12,9)-(12,10) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     964         /* 0x0000025C 00           */ IL_0000: nop
     965         /* (13,13)-(22,16) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     966         /* 0x0000025D 281800000A   */ IL_0001: call      class [mscorlib]System.Threading.Tasks.TaskFactory [mscorlib]System.Threading.Tasks.Task::get_Factory()
     967         /* 0x00000262 7E03000004   */ IL_0006: ldsfld    class [mscorlib]System.Action ConsoleApp1.Program/'<>c'::'<>9__0_0'
     968         /* 0x00000267 25           */ IL_000B: dup
     969         /* 0x00000268 2D17         */ IL_000C: brtrue.s  IL_0025
     970 
     971         /* 0x0000026A 26           */ IL_000E: pop
     972         /* 0x0000026B 7E02000004   */ IL_000F: ldsfld    class ConsoleApp1.Program/'<>c' ConsoleApp1.Program/'<>c'::'<>9'
     973         /* 0x00000270 FE0607000006 */ IL_0014: ldftn     instance void ConsoleApp1.Program/'<>c'::'<Main>b__0_0'()
     974         /* 0x00000276 731900000A   */ IL_001A: newobj    instance void [mscorlib]System.Action::.ctor(object, native int)
     975         /* 0x0000027B 25           */ IL_001F: dup
     976         /* 0x0000027C 8003000004   */ IL_0020: stsfld    class [mscorlib]System.Action ConsoleApp1.Program/'<>c'::'<>9__0_0'
     977 
     978         /* 0x00000281 6F1A00000A   */ IL_0025: callvirt  instance class [mscorlib]System.Threading.Tasks.Task [mscorlib]System.Threading.Tasks.TaskFactory::StartNew(class [mscorlib]System.Action)
     979         /* 0x00000286 26           */ IL_002A: pop
     980         /* (24,13)-(33,16) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     981         /* 0x00000287 281800000A   */ IL_002B: call      class [mscorlib]System.Threading.Tasks.TaskFactory [mscorlib]System.Threading.Tasks.Task::get_Factory()
     982         /* 0x0000028C 7E04000004   */ IL_0030: ldsfld    class [mscorlib]System.Action ConsoleApp1.Program/'<>c'::'<>9__0_1'
     983         /* 0x00000291 25           */ IL_0035: dup
     984         /* 0x00000292 2D17         */ IL_0036: brtrue.s  IL_004F
     985 
     986         /* 0x00000294 26           */ IL_0038: pop
     987         /* 0x00000295 7E02000004   */ IL_0039: ldsfld    class ConsoleApp1.Program/'<>c' ConsoleApp1.Program/'<>c'::'<>9'
     988         /* 0x0000029A FE0608000006 */ IL_003E: ldftn     instance void ConsoleApp1.Program/'<>c'::'<Main>b__0_1'()
     989         /* 0x000002A0 731900000A   */ IL_0044: newobj    instance void [mscorlib]System.Action::.ctor(object, native int)
     990         /* 0x000002A5 25           */ IL_0049: dup
     991         /* 0x000002A6 8004000004   */ IL_004A: stsfld    class [mscorlib]System.Action ConsoleApp1.Program/'<>c'::'<>9__0_1'
     992 
     993         /* 0x000002AB 6F1A00000A   */ IL_004F: callvirt  instance class [mscorlib]System.Threading.Tasks.Task [mscorlib]System.Threading.Tasks.TaskFactory::StartNew(class [mscorlib]System.Action)
     994         /* 0x000002B0 26           */ IL_0054: pop
     995         /* (35,13)-(35,31) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     996         /* 0x000002B1 281B00000A   */ IL_0055: call      valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
     997         /* 0x000002B6 26           */ IL_005A: pop
     998         /* (36,9)-(36,10) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
     999         /* 0x000002B7 2A           */ IL_005B: ret
    1000     } // end of method Program::Main
    1001 
    1002     // Token: 0x06000002 RID: 2 RVA: 0x000020B8 File Offset: 0x000002B8
    1003     .method private hidebysig static 
    1004         class [mscorlib]System.Collections.Generic.IEnumerable`1<string> CreateCollection () cil managed 
    1005     {
    1006         // Header Size: 1 byte
    1007         // Code Size: 8 (0x8) bytes
    1008         .maxstack 8
    1009 
    1010         /* 0x000002B9 1FFE         */ IL_0000: ldc.i4.s  -2
    1011         /* 0x000002BB 730D000006   */ IL_0002: newobj    instance void ConsoleApp1.Program/'<CreateCollection>d__1'::.ctor(int32)
    1012         /* 0x000002C0 2A           */ IL_0007: ret
    1013     } // end of method Program::CreateCollection
    1014 
    1015     // Token: 0x06000003 RID: 3 RVA: 0x000020C1 File Offset: 0x000002C1
    1016     .method public hidebysig specialname rtspecialname 
    1017         instance void .ctor () cil managed 
    1018     {
    1019         // Header Size: 1 byte
    1020         // Code Size: 8 (0x8) bytes
    1021         .maxstack 8
    1022 
    1023         /* 0x000002C2 02           */ IL_0000: ldarg.0
    1024         /* 0x000002C3 281C00000A   */ IL_0001: call      instance void [mscorlib]System.Object::.ctor()
    1025         /* 0x000002C8 00           */ IL_0006: nop
    1026         /* 0x000002C9 2A           */ IL_0007: ret
    1027     } // end of method Program::.ctor
    1028 
    1029     // Token: 0x06000004 RID: 4 RVA: 0x000020CA File Offset: 0x000002CA
    1030     .method private hidebysig specialname rtspecialname static 
    1031         void .cctor () cil managed 
    1032     {
    1033         // Header Size: 1 byte
    1034         // Code Size: 11 (0xB) bytes
    1035         .maxstack 8
    1036 
    1037         /* (70,9)-(70,66) C:Users
    ismo202source
    eposConsoleApp1ConsoleApp1Program.cs */
    1038         /* 0x000002CB 731C00000A   */ IL_0000: newobj    instance void [mscorlib]System.Object::.ctor()
    1039         /* 0x000002D0 8001000004   */ IL_0005: stsfld    object ConsoleApp1.Program::globalLock
    1040         /* 0x000002D5 2A           */ IL_000A: ret
    1041     } // end of method Program::.cctor
    1042 
    1043 } // end of class ConsoleApp1.Program
    View Code

    查看IL,我们发现在掉用 '<CreateCollection>d__1'.MoveNext() 方法时,加了锁,在调用 '<CreateCollection>d__1''<>m__Finally2'() 方法时(调用结束时)解了锁。

    但是,如果我们在第一次调用 MoveNext() 之前,另一个线程调用了 CreateCollection() 方法,那么可能第二个线程可能先执行。

    总结:

    1、对于yield方法来说,在所有操作上加锁,并不能保证 yield 方法体内的代码同步;

    2、yield方法体内的代码,只有在调用 MoveNext() 方法时才会调用;

  • 相关阅读:
    vs 2005 使用 UpdatePanel 配置
    gridview checkbox 列
    csv 格式文件 导入导出
    UML中数据流图,用例图,类图,对象图,角色图,活动图,序列图详细讲述保存供参考
    c# 根据经纬度 求两点之间的距离
    c# 加密汇总
    日期获取 第一天,最后一天
    求点到直线的垂足
    c# 修改注册表
    HDOJ_1548 上楼梯 DJ
  • 原文地址:https://www.cnblogs.com/lee2014/p/10158841.html
Copyright © 2011-2022 走看看