惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
B
Blog
IT之家
IT之家
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
量子位
博客园 - 叶小钗
T
Tailwind CSS Blog
小众软件
小众软件
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
雷峰网
雷峰网
博客园 - 三生石上(FineUI控件)
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Blog — PlanetScale
Blog — PlanetScale
V
V2EX
博客园_首页
I
InfoQ
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - kiminozo

UAP如何根据DeviceFamily显示不同的页面 Windows 10 响应式设计和设备友好的开发 Windows Phone Toolkit for WP8 已经出了 代码分享 ScrollViewerListener 获取ScrollViewer的位置改变 WP7技巧 扩展【共享...】按钮 Bangumi 番組計劃 WP手机客户端发布 WP7进阶技巧 自定义Toast 提示动画效果 WP7自定义控件 TabSwitch控件 模拟Windows phone 开始菜单的瓦片动画 WP7自定义控件 评分控件 WP7应用开发笔记 TiltEffect为控件添加倾斜的触控响应效果 从FLC中学习的设计模式系列-结构型模式(3)-享元模式 WP7应用开发笔记 继承BitmapSource并使用独立存储来缓存远程的图片 用代理类包装异步调用方法实现异步命令 解决log4net在.net 4.0 ClientProfile下无法使用 从FLC中学习的设计模式系列-结构型模式(2)-装饰 从FLC中学习的设计模式系列-结构型模式(1)-适配器 从FLC中学习的设计模式系列-创建型模式(5)-原型 从FLC中学习的设计模式系列-创建型模式(4)-建造者
经验 C#手动同步的滥用实例
kiminozo · 2012-04-18 · via 博客园 - kiminozo

刚刚到新公司发现很多同学在用AutoResetEvent作线程同步,有的人用AutoResetEvent代替了C#的lock,

public void Func2()
{
Console.WriteLine("Func2 WaitOne");
autoResetEvent.WaitOne();
 Thread.Sleep(1000); //do Something
Console.WriteLine("Func2 Set");
autoResetEvent.Set();
}

这种写法我还是真是第一次见到。所以不是很确定,结果我研究了一下果然杯具了,重入后直接死锁了。

示例:

class Program
{


static void Main(string[] args)
{
var p = new Program();

p.Func1();/这样会死锁}

AutoResetEvent autoResetEvent = new AutoResetEvent(true);

public void Func1()
{
Console.WriteLine("Func1 WaitOne");
autoResetEvent.WaitOne();
Thread.Sleep(1000);
Func2();
Console.WriteLine("Func1 Set");
autoResetEvent.Set();
}

public void Func2()
{
Console.WriteLine("Func2 WaitOne");
autoResetEvent.WaitOne();
Thread.Sleep(1000);
Console.WriteLine("Func2 Set");
autoResetEvent.Set();
}
}

正确的写法还是用lock或者直接Monitor(try-finally暂时省略),看来这周需要花大功夫整改了。

private readonly object lockObj = new object();

        public void Func3()
        {
            Console.WriteLine("Func3 WaitOne");
            Monitor.Enter(lockObj);
            Thread.Sleep(1000);
            Func4();
            Console.WriteLine("Func3 Set");
            Monitor.Exit(lockObj);
        }

        public void Func4()
        {
            Console.WriteLine("Func4 WaitOne");
            Monitor.Enter(lockObj);
            Thread.Sleep(1000);
            Console.WriteLine("Func4 Set");
            Monitor.Exit(lockObj);
        }