En .NET ¿cómo puedo saber si una clase o método es seguro para subprocesos o no? ¿Por defecto no es seguro para subprocesos?¿Existe un atributo para marcar la clase o el método para que sea seguro para subprocesos en .NET?
¿Existe un atributo para marcar la clase o el método para que sea seguro para subprocesos en .NET?
Respuesta
Esto no es un atributo para esto: tiene que leer la documentación de cada elemento que le interese. No puede hacer que un hilo sea seguro simplemente añadiéndole un atributo. Es como tomar una naranja y ponerle una pegatina que diga "Apple".
Por supuesto, lo mismo es cierto para la serialización y no los detuvo allí, pero aún así: ningún atributo. Lee los documentos.
Se supone que todos los métodos y propiedades estáticos son seguros para subprocesos (es decir, a menos que se indique lo contrario), por ejemplo, métodos es que no lo son. – Richard
Suponiendo que un método no es seguro para subprocesos cuando no causa ningún daño, suponiendo que uno es seguro para subprocesos cuando no puede ser desagradable. Será mejor que suponga que nada es seguro para subprocesos a menos que se indique. – JoshBerke
Le di la espalda a Joel Coehoorn en este caso, sería fácil 'falsificar' tales afirmaciones.
Por qué no añadir el texto multi-hilo en la descripción de la función
No me preocuparía tanto por "fingirlo". Pero la concurrencia es difícil: es muy probable que se haya producido un error y ese atributo sea incorrecto. –
Pero si el atributo es incorrecto, es probable que la documentación (si la hay) sea igual de incorrecta. –
Estoy totalmente de acuerdo con @JimMischel, pero Joel no fue quien abogó por la documentación. Al menos los atributos son legibles por máquina, lo que permite, como mínimo, la enumeración automatizada, el filtrado, la generación de informes, etc. de los métodos atribuidos, y posiblemente incluso algunas formas débiles de análisis estático y/o prevención de errores.Los atributos son el camino a seguir, pero necesitaría un sistema elaborado y completo de ellos para capturar la semántica de simultaneidad de una manera realmente útil. Para .NET, no conozco ningún diseño o propuesta de este tipo. –
No hay ningún caso utilice el escenario de hacer una clase sincronizado, en lo que se refiere a método que se utiliza siguiendo el estilo de codificación:
using System.Runtime.CompilerServices;
[MethodImpl(MethodImplOptions.Synchronized)]
void MyMethod()
{
DoSomething();
}
El problema es; eso todavía no implica que el método sea seguro para la ejecución de subprocesos, ya que otro subproceso podría estar llamando a un método diferente que * no * tenga el [MethodImpl], por lo que se descartarán entre sí. Del mismo modo, incluso si todos los campos son de solo lectura, los campos en los objetos secundarios podrían ser mutables y causar problemas. –
Incluso si este llamado "estilo de codificación" * podría * significar algo (vea numerosos otros comentarios en esta página), la bandera 'MethodImplOptions.Synchronized' tiene el significado opuesto de lo que busca el OP. Este indicador indica que el método es ** no ** seguro para subprocesos. De la documentación: "El método se puede ejecutar con solo un hilo a la vez". –
Se es posible hacer todos los accesos a su serie de objeto a través de IContributeObjectSink/IContextAttribute
aunque esto sufrirá un gran golpe de rendimiento ya que requerirá su objeto a la subclase MarshalByRefObject
, sobrecarga de creación de contexto, etc ...
No, y sería inútil.
Asumamos que tengo una lista segura hilo, que tiene tres Tema Safe ™ métodos:
void Add(something);
void Remove(index);
int GetCount();
something GetElementAt(index);
un hilo de:
for 1 to 100 do
list.Add(12);
Tema dos y tres:
while(list.GetCount() >0)
{
list.Remove(0);
}
El código anterior se bloqueará (tarde o temprano) porque la lista podría cambiar entre el momento en que llame a GetCount
y Remove
- 1. ¿Este código es seguro para subprocesos? ¿Cómo puedo hacer que sea seguro para subprocesos?
- 2. Directrices para probar el código multiproceso o asegurarse de que el código sea seguro para subprocesos
- 3. ¿Es necesario que un método organizado en el subproceso de UI sea seguro para subprocesos?
- 4. ¿La forma más simple de hacer que todo un método sea seguro para subprocesos?
- 5. Cómo hacer que Java.util.Date sea seguro para subprocesos
- 6. ¿El retorno es atómico y debería usarlo temporalmente en getter para que sea seguro para subprocesos?
- 7. NSTimer ¿es seguro para subprocesos?
- 8. ¿PrintWriter es seguro para subprocesos?
- 9. EventAggregator, ¿es seguro para subprocesos?
- 10. ¿SQLite.Net es seguro para subprocesos?
- 11. Enum.TryParse - ¿es seguro para subprocesos?
- 12. C# Singleton seguro para subprocesos
- 13. ¿SecureRandom es seguro para subprocesos?
- 14. ¿Stream.Write es seguro para subprocesos?
- 15. C++ Segmento seguro para subprocesos
- 16. ¿Cómo marcar un conjunto .net como seguro?
- 17. ¿HttpContext.Current.Cache es seguro para subprocesos?
- 18. Uso de TDD para expulsar el código seguro para subprocesos
- 19. ¿Hay alguna forma de marcar un método para garantizar que T no sea nulo?
- 20. ¿Es PHP seguro para subprocesos?
- 21. ¿Este procedimiento almacenado es seguro para subprocesos? (o lo que sea que el equivalente esté en SQL Server)
- 22. ¿MongoDB es seguro para subprocesos?
- 23. ¿Es System.ServiceModel.Channels.BufferManager seguro para subprocesos?
- 24. ¿Está leyendo un doble que no es seguro para subprocesos?
- 25. ¿Es itertools seguro para subprocesos?
- 26. guava-libraries: ¿es Iterators.cycle() seguro para subprocesos?
- 27. ¿DWScript es seguro para subprocesos?
- 28. Log4Net FileAppender no es seguro para subprocesos?
- 29. Java Transport.send() ¿es seguro para subprocesos?
- 30. ¿Existe un atributo .NET para especificar el "nombre para mostrar" de una propiedad?
¿Qué propósito le gustaría que sirviera dicho atributo? – AnthonyWJones
Puede ser un tipo de documentación de código para advertir al usuario de clase –
Si solo quiere documentación, podría ponerla en la sección . –