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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 49             /* 0x000002E4 00           */ IL_0000: nop
 50             /* (32,25)-(32,42) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 62                 /* 0x000002F6 00           */ IL_0012: nop
 63                 /* (34,34)-(34,43) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 64                 /* 0x000002F7 16           */ IL_0013: ldc.i4.0
 65                 /* 0x000002F8 0C           */ IL_0014: stloc.2
 66                 /* (hidden)-(hidden) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 67                 /* 0x000002F9 2B5D         */ IL_0015: br.s      IL_0074
 68                 // loop start (head: IL_0074)
 69                     /* (35,29)-(35,30) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 70                     /* 0x000002FB 00           */ IL_0017: nop
 71                     /* (36,33)-(36,51) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
103                     /* 0x00000353 00           */ IL_006F: nop
104                     /* (34,53)-(34,56) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
135                 /* 0x00000370 DC           */ IL_008C: endfinally
136             } // end handler
137 
138             /* (43,21)-(43,22) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
183             /* 0x0000038E 00           */ IL_0000: nop
184             /* (45,25)-(45,53) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
379                 /* 0x00000467 00           */ IL_0027: nop
380                 /* (hidden)-(hidden) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
393                 /* 0x0000048B 00           */ IL_004B: nop
394                 /* (27,17)-(27,34) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
419                     /* 0x000004CC 00           */ IL_008C: nop
420                     /* (29,21)-(29,42) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
459                     /* 0x0000052E DC           */ IL_00EE: endfinally
460                 } // end handler
461 
462                 /* (hidden)-(hidden) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
467                 /* 0x00000536 00           */ IL_00F6: nop
468                 /* (50,41)-(50,76) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
480                 /* 0x0000055A 2B39         */ IL_011A: br.s      IL_0155
481 
482                 /* (50,26)-(50,37) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
489                 /* 0x0000056D 00           */ IL_012D: nop
490                 /* (52,21)-(52,39) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
747         /* 0x0000025C 00           */ IL_0000: nop
748         /* (14,13)-(14,59) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
752         /* 0x00000263 00           */ IL_0007: nop
753         /* (16,17)-(16,24) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
754         /* 0x00000264 00           */ IL_0008: nop
755         /* (16,40)-(16,44) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
762             /* 0x0000026C 2B1A         */ IL_0010: br.s      IL_002C
763             // loop start (head: IL_002C)
764                 /* (16,26)-(16,36) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
769                 /* 0x00000275 00           */ IL_0019: nop
770                 /* (18,21)-(18,55) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
777                 /* 0x00000287 00           */ IL_002B: nop
778 
779                 /* (16,37)-(16,39) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
798             /* 0x0000029C DC           */ IL_0040: endfinally
799         } // end handler
800 
801         /* (20,13)-(20,14) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
802         /* 0x0000029D 00           */ IL_0041: nop
803         /* (21,9)-(21,10) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
  64             /* 0x000002F8 00           */ IL_0000: nop
  65             /* (15,17)-(15,96) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
  77             /* 0x0000031E 00           */ IL_0026: nop
  78             /* (18,40)-(18,44) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
  85                 /* 0x00000326 2B29         */ IL_002E: br.s      IL_0059
  86                 // loop start (head: IL_0059)
  87                     /* (18,26)-(18,36) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
  92                     /* 0x0000032F 00           */ IL_0037: nop
  93                     /* (20,21)-(20,96) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 103                     /* 0x00000350 00           */ IL_0058: nop
 104 
 105                     /* (18,37)-(18,39) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 124                 /* 0x00000365 DC           */ IL_006D: endfinally
 125             } // end handler
 126 
 127             /* (22,13)-(22,14) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 146             /* 0x00000384 00           */ IL_0000: nop
 147             /* (26,17)-(26,96) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 159             /* 0x000003AA 00           */ IL_0026: nop
 160             /* (29,40)-(29,44) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 167                 /* 0x000003B2 2B29         */ IL_002E: br.s      IL_0059
 168                 // loop start (head: IL_0059)
 169                     /* (29,26)-(29,36) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 174                     /* 0x000003BB 00           */ IL_0037: nop
 175                     /* (31,21)-(31,96) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 185                     /* 0x000003DC 00           */ IL_0058: nop
 186 
 187                     /* (29,37)-(29,39) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 206                 /* 0x000003F1 DC           */ IL_006D: endfinally
 207             } // end handler
 208 
 209             /* (33,13)-(33,14) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 256             /* 0x0000041C 00           */ IL_0000: nop
 257             /* (47,25)-(47,60) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 262             /* 0x00000428 16           */ IL_000C: ldc.i4.0
 263             /* 0x00000429 0A           */ IL_000D: stloc.0
 264             /* (hidden)-(hidden) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 265             /* 0x0000042A 2B7B         */ IL_000E: br.s      IL_008B
 266             // loop start (head: IL_008B)
 267                 /* (49,25)-(49,26) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 268                 /* 0x0000042C 00           */ IL_0010: nop
 269                 /* (50,29)-(50,47) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 307                 /* 0x000004A2 00           */ IL_0086: nop
 308                 /* (48,49)-(48,52) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 369             /* 0x000004BE 00           */ IL_0000: nop
 370             /* (58,25)-(58,53) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 593                 /* 0x000005BF 00           */ IL_0027: nop
 594                 /* (hidden)-(hidden) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 607                 /* 0x000005E3 00           */ IL_004B: nop
 608                 /* (42,17)-(42,34) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 634                 /* 0x0000062C 00           */ IL_0094: nop
 635                 /* (44,21)-(44,42) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 655                 /* 0x00000670 00           */ IL_00D8: nop
 656                 /* (62,45)-(62,80) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 669                 /* 0x00000699 2B39         */ IL_0101: br.s      IL_013C
 670 
 671                 /* (62,30)-(62,41) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 678                 /* 0x000006AC 00           */ IL_0114: nop
 679                 /* (64,25)-(64,43) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.cs */
 964         /* 0x0000025C 00           */ IL_0000: nop
 965         /* (13,13)-(22,16) C:\Users\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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\rismo202\source\repos\ConsoleApp1\ConsoleApp1\Program.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() 方法时才会调用;

 

posted @ 2021-03-25 18:44  plle  阅读(400)  评论(0编辑  收藏  举报