zoukankan      html  css  js  c++  java
  • 双SynchronizationContext同步请求造成UI死锁

    代码

    private void btnRun_Click(object sender, EventArgs e)
    {
        var sc = SynchronizationContext.Current;
        //①
        sc.Send(o =>
        {
    	btnRun.Text = DateTime.Now.ToString();
    	var t = new Thread(() =>
    	{
    	    //②
    	    sc.Send(oo =>
    	    {
    		Thread.Sleep(1000);
    		btnRun.Text = DateTime.Now.ToString();
    	    }, null);
    	});
    	t.Start();
    	t.Join();
        }, null);
    }
    

    解释

    ①处开始占用SynchronizationContext,并开始同步执行一直等待②处执行完毕。但②处也申请占用SynchronizationContext以将自己的代码执行完毕。砰~DeadLock条件成立!

    解决

    将同步调用改成异步,破坏死锁条件。将②处的“sc.Send”改成“sc.Post”即可。

    结论

    牵涉到“同步”与“资源占用”的话,要注意是否可能会造成死锁。

    个人挺不愿花许多心思在业务代码上,乱刀斩乱麻,直接避免“同步”与“资源占用”,即避免使用SynchronizationContext.Send(),统一使用SynchronizationContext.Post()。

    参考

    UI thread client callback和UI thread WCF Service一起工作时死锁的形成原因及解决方法


    勉強心を持てば、生活は虚しくない!
  • 相关阅读:
    协程
    多进程
    多线程
    模块进阶
    内建函数
    内建属性
    属性property
    私有化
    深拷贝、浅拷贝
    ==、is
  • 原文地址:https://www.cnblogs.com/beta2013/p/3377297.html
Copyright © 2011-2022 走看看