Estoy tratando de averiguar si Enum.TryParse de .NET 4.0 es seguro para subprocesos.Enum.TryParse - ¿es seguro para subprocesos?
El código fuente (descompilación) es:
[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;
}
Lo que parece problemático para mí es esta línea:
result = default(TEnum); /// (*)
¿Qué pasa si otro resultado hilo visitada justo después de que ha sido establecido en el valor predeterminado y antes de que se establezca en el valor analizado?
[EDITAR] Siguiendo la respuesta de Zoidberg, me gustaría volver a formular la pregunta un poco.
La pregunta es, supongo, si Enum.TryParse es "transaccional" (o atómico).
Decir que tengo un campo estático, y pasarlo a Enum.TryParse:
public static SomeEnum MyField;
....
Enum.TryParse("Value", out MyField);
Ahora, cuando se está ejecutando TryParse, otro hilo accesos MiCampo. TryParse cambiará el valor de MyField al valor predeterminado de SomeEnum por un tiempo, y solo entonces lo establecerá en el valor analizado.
Esto no es necesariamente un error en mi código. Esperaría que Enum.TryParse establezca MyField en el valor analizado o que no lo toque en absoluto, no lo use como su campo temporal.
Parece que otros métodos .NET TryParse también utilizan la variable de referencia para su propio almacenamiento temporal. ¿No debería considerarse esto un error en el código de Microsoft? Cuando solicite configurar una variable a un valor, normalmente no esperará que pase por otros estados antes de establecerse. –
¿Está ** documentado ** como enhebrable? De lo contrario, ** si realmente es o no, no deberías confiar en que sea seguro para los hilos **. –