lock中使用迭代返回yield return是否会释放锁?

项目中遇到一个问题如题,于是做了个小实验,发现在lock中yield return并不会释放该lock,直到整个迭代器完全执行完或者yield break后才会释放lock。

 1 class Program
 2     {
 3         static object mylock = new object();
 4         static long index = 0xff;
 5
 6         static void Main(string[] args)
 7         {
 8             System.Threading.Thread t1 = new System.Threading.Thread(
 9                 () =>
10                 {
11                     foreach (long l in method1())
12                     {
13                         for (int i = 0; i < 0xff;i++ )
14                             Console.WriteLine("\t" + i.ToString("X2"));
15                         Console.WriteLine(l.ToString("X4"));
16                     }
17                 });
18             t1.IsBackground = true;
19             t1.Start();
20
21
22             System.Threading.Thread t2 = new System.Threading.Thread(
23                 () =>
24                 {
25                     for (int i = 0; i < 100; i++)
26                     {
27                         lock (mylock)
28                         {
29                             Console.WriteLine("\t\t\tI‘m in the lock!");
30                         }
31                     }
32                 });
33             t2.IsBackground=true;
34             t2.Start();
35
36
37             Console.ReadKey();
38         }
39
40         static IEnumerable<long> method1()
41         {
42             lock (mylock)
43             {
44                 for (long i = 0; i < index; i++)
45                 {
46                     yield return i;
47                 }
48             }
49         }
50     }

运行如下:

lock中使用迭代返回yield return是否会释放锁?

时间: 2024-08-01 10:44:16

lock中使用迭代返回yield return是否会释放锁?的相关文章

C#中,什么时候用yield return

yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历. 有这样的一个int类型的集合: static List<int> GetInitialData() { return new List<int>(){1,2,3,4}; } 需要打印出所有值大于2的元素. 不使用yield return的实现 static IEnumerable<int> FilterWithoutYiel

yield return简单示例

List<int> list = new List<int>() { 1,2,3,4 }; // 需求:返回所有大于n的数 // 方法1(不使用yield return) IEnumerable<int> WithoutYield(List<int> list, int n) { List<int> result = new List<int>(); foreach (int i in list) { if (i > n) {

yield学习续:yield return迭代块在Unity3D中的应用——协程

必读好文推荐: Unity协程(Coroutine)原理深入剖析 Unity协程(Coroutine)原理深入剖析再续 上面的文章说得太透彻,所以这里就记一下自己的学习笔记了. 首先要说明的是,协程并不是线程,协程是运行在主线程中的,是和主线程同步执行的代码,不同的地方是运行的方法可以被yield return在当前帧进行打断,到下一帧后可以继续从被打断的地方继续运行. 下面我们看一个示例,场景中有一个空的GameObject对象,其绑定了下面的脚本: 1 using UnityEngine;

C#中的yield return与Unity中的Coroutine(协程)

C#中的yield return C#语法中有个特别的关键字yield, 它是干什么用的呢? 来看看专业的解释: yield 是在迭代器块中用于向枚举数对象提供值或发出迭代结束信号.它的形式为下列之一:yield return <expression>;yield break 看如下例子: 1 public class CustomCollection :IEnumerable { 2 3 public static void Main (string[] args) 4 { 5 Custom

造轮子_C#中yield return用法分析

厂址: http://www.jb51.net/article/54810.htm static List<int> GetInitialData() {   return new List<int>(){1,2,3,4}; } 打印出所有值大于2的元素 不使用yield return的实现 static IEnumerable<int> FilterWithoutYield() {   List<int> result = new List<int&

C#中yield return用法分析(转载自shichen2014)

本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解.具体如下: yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历. 有这样的一个int类型的集合: ? 1 2 3 4 static List<int> GetInitialData() {   return new List<int>(){

C#中yield return用法

1.yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历 不使用yield return的实现 static IEnumerable<int> FilterWithoutYield() { List<int> result = new List<int>(); foreach (int i in GetInitialData()) { if (i > 2) { result

C#中yield return用法分析

这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield return的流程,更直观的分析了yield return的用法,需要的朋友可以参考下. 本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解.具体如下: yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历. 有

C#中yield return的用法示例

using System; using System.Collections.Generic; namespace YieldReturn { class Program { static void Main(string[] args) { var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var resultNormal = EvenNormal(list); foreach (var item in resultNormal)