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

推荐订阅源

V
V2EX
博客园 - 叶小钗
WordPress大学
WordPress大学
N
Netflix TechBlog - Medium
M
MIT News - Artificial intelligence
美团技术团队
aimingoo的专栏
aimingoo的专栏
博客园_首页
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Security Blog
Microsoft Security Blog
Last Week in AI
Last Week in AI
The GitHub Blog
The GitHub Blog
小众软件
小众软件
T
Tailwind CSS Blog
Martin Fowler
Martin Fowler
B
Blog RSS Feed
月光博客
月光博客
量子位
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Hugging Face - Blog
Hugging Face - Blog
IT之家
IT之家
Y
Y Combinator Blog
B
Blog
MyScale Blog
MyScale 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);
        }