为什么此代码段在重负载下返回null?

时间:2014-09-17 10:05:44

标签: c# multithreading wcf endpoint

if (this.UserManagmentType != UserMgmtType.NONE)
{
   return (User)GetUserBaseById(userId);
}

if (this.UserManagmentType != UserMgmtType.NONE)
{
   return GetUserBaseById(userId) as User;
}

我理解演员之间的区别。如果转换失败,第一个if语句应抛出无效的强制转换异常,而第二个if语句将返回null。

我的问题是,对于多线程环境中的重载的,为什么第一个if语句偶尔会返回null,而第二个if语句总是会返回有效数据? / p>

另一个注意事项是包含方法是WCF端点。

感谢您的任何见解。

2 个答案:

答案 0 :(得分:3)

根据您发布的代码,答案是:它不会。

如果(且仅当)null返回null,则第一个代码段将返回GetUserBaseById。如果方法的返回为null ,则第二个将返回null,如果它不是User对象,则返回。这种行为在重负荷下不会改变。

如果您在重载时看到不同的结果,那么我建议您在代码的其他地方遇到多线程问题,而这恰好就是您正在看到效果的地方。这种错误可能对外部条件非常敏感,并且您无法保证每次运行时它都会以相同的方式重现(因为它可能对其他进程的磁盘争用敏感)。

我建议彻底审查有问题的多线程功能:您遇到的问题不在于该行代码。

答案 1 :(得分:0)

两种铸件是不同的,根据本文

http://www.codeproject.com/Articles/8052/Type-casting-impact-over-execution-performance-in

使用as关键字更快,我认为这与返回值总是相比,而且与前缀强制相比。

但是我认为您需要仔细检查如何实现GetUserBaseById(userId)方法,因为我怀疑它可能无法在多线程环境中正确实现。