我的电脑是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的时候可以成功
彻底懵了