Me he encontrado con este problema varias veces durante el desarrollo en C#. Voy a ser un feliz a lo largo de codificación, los objetos que pasan de aquí para allá entre los hilos y lo que no, entonces, de repente, me sale este error familiar:¿Por qué algunos objetos no son accesibles desde diferentes subprocesos?
"The calling thread cannot access this object because a different thread owns it."
Pues bien, he tratado con él antes, especialmente con objetos en el hilo de la GUI. Solo tiene que escribir un código adicional para programar alrededor de ese problema específico. Pero de vez en cuando me encuentro con un objeto que, por supuesto, es ordinario, pero que no le gusta ser accedido por diferentes hilos.
EDIT Me equivocaron en mi publicación original sobre el objeto que causaba la excepción de acceso. NO fue IPAddress, en su lugar es System.Printing.PrintQueue. que estaba utilizando para obtener la dirección IP. Este es el objeto que no puede evaluar a partir de más de 1 hilo.
Todas mis clases que he escrito nunca tienen este problema. Ni siquiera sé cómo implementaría esto yo mismo. ¿Tendrías que mantener una variable miembro con la identificación del hilo que te creó, y luego verificar el hilo actual contra eso en cada propiedad y acceso al método? Eso parece una locura. ¿Por qué Microsoft decidiría que ... "OK ... PrintQueue, definitivamente no se puede compartir entre hilos. Pero estas otras clases ... están bien para ir".
¿Por qué se bloquean algunos objetos del acceso a múltiples subprocesos?
Piensa en la alternativa: cualquier hilo puede acceder a cualquier objeto como quiera. Ahora ese objeto tiene que depender del acceso para manejar adecuadamente las preocupaciones de enhebrado, o tiene que escribir un montón de código adicional para garantizar que sea seguro para los usuarios de múltiples hilos. La opción 1 no es realista, y la opción 2 es mucho trabajo. Por lo tanto, se tomó la decisión de ir con la opción 3: no permitir acceso a los usuarios desde múltiples hilos. – dlev
Bad Microsoft. Malo. –
Parece que la eliminación de basura C# bloquea ciertas variables dependiendo de cómo se usan. Nunca he tenido que lidiar con esto, pero una buena forma de intentar solucionar este problema es colocar sus variables en un soporte estático si planea compartirlas entre hilos. Un hilo lee el otro hilo escribe. Es posible que deba hacer algunos bloqueos para asegurarse de que no haya colisiones al escribir si ambos necesitan cambiar el valor. –