我想弄清楚如果.NET 4.0的Enum.TryParse是线程安全的。Enum.TryParse - 线程安全吗?
的源代码(反编译)是:
[SecuritySafeCritical]
public static bool TryParse<TEnum>(string value, bool ignoreCase, out TEnum result) where TEnum : struct
{
result = default(TEnum); /// (*)
Enum.EnumResult enumResult = default(Enum.EnumResult);
enumResult.Init(false);
bool result2;
if (result2 = Enum.TryParseEnum(typeof(TEnum), value, ignoreCase, ref enumResult))
{
result = (TEnum)enumResult.parsedEnum;
}
return result2;
}
似乎什么问题的,我是这一行:
result = default(TEnum); /// (*)
如果另一个线程访问结果之后它被设置为默认值,并且在它被设置为解析值之前?
[编辑] 按照Zoidberg的回答,我想重新解释一下这个问题。
问题是,我猜,如果Enum.TryParse是“事务性”(或原子)。
说我有一个静态字段,并把它传递到Enum.TryParse:
public static SomeEnum MyField;
....
Enum.TryParse("Value", out MyField);
现在正在执行的TryParse时,另一个线程访问MyField的。 TryParse会将MyField的值更改为SomeEnum的默认值一段时间,然后才会将其设置为解析值。
这不一定是我的代码中的一个错误。我希望Enum.TryParse或者将MyField设置为解析值,或者根本不触摸它,而不是将其用作临时字段。
似乎其他.NET TryParse方法也会将自己的ref变量用于其自己的临时存储。这不应该被认为是微软代码中的一个错误吗?当你要求将一个变量设置为一个值时,你通常不会期望它在经过设定之前经过其他许多状态。 – 2012-03-02 13:41:20
它被记录为线程安全吗?如果不是,那么**不管它是否真的是,你不应该依赖它是线程安全**。 – 2012-03-02 18:40:03