加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 从委托中锁定静态对象不起作用

发布时间:2020-12-16 00:19:45 所属栏目:百科 来源:网络整理
导读:为什么这不起作用? private static object Lock_HandleError = new object();public static void HandleError(Exception ex){ lock( Lock_HandleError ) { //IF the UI is processing a visual tree event (such as IsVisibleChanged),it throws an excepti
为什么这不起作用?

private static object Lock_HandleError = new object();
public static void HandleError(Exception ex)
{
    lock( Lock_HandleError )
    {
        //IF the UI is processing a visual tree event (such as IsVisibleChanged),it throws an exception when showing a MessageBox as described here: http://social.msdn.microsoft.com/forums/en-US/wpf/thread/44962927-006e-4629-9aa3-100357861442
        //The solution is to dispatch and queue the MessageBox. We must use BeginInvoke because dispatcher processing is suspended in such cases.
        Dispatcher.CurrentDispatcher.BeginInvoke((Action)delegate()
        {
            lock( Lock_HandleError )
            {
                Dispatcher.CurrentDispatcher.BeginInvoke((Action)delegate(){ 
                    HandleError(new Exception("testing purposes only")); 
                },DispatcherPriority.Background);

                MessageBox.Show(ex.Message,"Application Error",MessageBoxButton.OK,MessageBoxImage.Error);
                //This point is not reached until the user clicks "OK"
            }
        },DispatcherPriority.Background);
    }
}

public void main()
{
    HandleError(new Exception("The first error"));
}

上述代码的预期行为是一次出现一条错误消息,当用户单击“确定”时,Lock_HandleError对象将从调度的线程释放,下一次调用HandleError可以继续 – 但是我得到的是无限级联的错误消息,而没有达到“OK”.

为什么这个锁没有工作?

通过在每个lock语句的入口和出口处设置断点,我可以清楚地看到委托正在调用lock()并再次调用新的“HandleError”调用,然后在MessageBox上暂停以等待用户输入.

同时,在另一个线程中,对HandleError的调度调用会运行 – 但不是像它应该那样等待lock()语句,它只是爆破它,即使MessageBox委托显然放置了一个锁并且还没有释放它.

解决方法

两部分答案:

>了解锁是可重入的.当一个线程已经锁定一个对象时,该线程可以一次又一次地使用相同的锁而不会阻塞.>当第一个MessageBox启动时,UI线程仍在处理消息,因此在UI线程上处理对HandleError的后续(递归)调用(因为它已经持有锁,可以重新输入它).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读