none
请教一个 函数重入的问题 RRS feed

  • 问题

  • 我的电脑是4核CPU,发现用了同步方法后,并不能规避函数重入问题,dipatcher.invoke() , lock(obj)

    代码如下

      private void Button_Click_1(object sender, RoutedEventArgs e)
      {
            for(int i = 0; i < 5; i++)
                LogOut();
       }
    
     private static object lockObj = new object();
            public void LogOut()
            {
                lock (lockObj)
                {
                    _bLogOutCalled = true;
                    fc_talking_manager_logger.WriteLog("LogOut---------_bLogin = {0}", _bLogin);
                    if (_bLogin && !_bLogoutProgressing)
                    {
                        fc_talking_manager_logger.WriteLog("LogOut--------Processing-------");
                        _bLogoutProgressing = true;
                        NIM.ClientAPI.Logout(NIMLogoutType.kNIMLogoutChangeAccout, HandleLogOutResult);
                    }
              }
          }

    出现的打印如下

    [2016-09-23 10:00:39:417] LogOut---------_bLogin = True
    [2016-09-23 10:00:39:418] LogOut---------_bLogin = True
    [2016-09-23 10:00:39:419] LogOut---------_bLogin = True
    [2016-09-23 10:00:39:419] LogOut---------_bLogin = True
    [2016-09-23 10:00:39:420] LogOut---------_bLogin = True

    非常奇怪,把循环次数改成3可以成功,比如2,5,9等等都会失败,全是并发进入函数

    改成invoke来同步到主线程同样有问题

    如果不用任何同步方法,在循环次数为9的时候可以成功

    彻底懵了

    2016年9月23日 2:11

全部回复

  • LogOut方法中放个断点,调试的时候,看下线程窗口Thread,或是并行窗口Parallel Stacks

    看下这到底是怎么形成的,这个输出结果确实比较奇怪。


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年9月23日 16:12