【发布时间】:2012-03-02 13:08:52
【问题描述】:
我正在尝试确定 .NET 4.0 的 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 变量用于自己的临时存储。这不应该被认为是微软代码中的一个错误吗?当您要求将变量设置为一个值时,您通常不会期望它在设置之前经历许多其他状态。
-
它是否被记录为线程安全的?如果不是,那么不管它是否真的是线程安全的,你都不应该依赖它是线程安全的。
标签: c# .net .net-4.0 enums tryparse