tiempo termino segundo saber programacion plano parametros mismo metodos hilos ejemplos ejecutar con como asincrona c# multithreading unit-testing testing

termino - metodos de hilos c#



¿Cuál es la mejor manera de probar la unidad desde múltiples hilos? (3)

@ajmastrean, dado que el resultado de la prueba unitaria debe ser predecible, necesitamos sincronizar los hilos de alguna manera. No puedo ver una manera simple de hacerlo sin usar eventos.

Descubrí que ThreadPool.QueueUserWorkItem me brinda una manera fácil de probar tales casos de uso

ThreadPool.QueueUserWorkItem(x => { File.Open(fileName, FileMode.Open); event1.Set(); // Start 2nd tread; event2.WaitOne(); // Blocking the file; }); ThreadPool.QueueUserWorkItem(x => { try { event1.WaitOne(); // Waiting until 1st thread open file File.Delete(fileName); // Simulating conflict } catch (IOException e) { Debug.Write("File access denied"); } });

este tipo de seguimiento de otra pregunta mía.

Básicamente, una vez que tenga el código para acceder al archivo (revisará las respuestas allí en un minuto), ¿cuál sería la mejor manera de probarlo ?

Estoy pensando en crear un método que genere bastantes archivos de BackgroundWorker o algo así y les diga a todos que carguen / guarden el archivo, y que prueben con diferentes tamaños de archivo / objeto. Luego, obtenga una respuesta de los hilos para ver si falló / tuvo éxito / hizo que el mundo implosione, etc.

¿Pueden aportar alguna sugerencia sobre la mejor manera de abordar esto? Como dije antes, esto es algo nuevo para mí :)

Editar

Siguiendo la publicación de ajmastrean :

Estoy usando una aplicación de consola para probar con Debug.Asserts :)

Actualizar

Originalmente rodé con el uso de BackgroundWorker para tratar con el subprocesamiento (ya que estoy acostumbrado al desarrollo de Windows). Pronto me di cuenta de que cuando estaba realizando pruebas donde múltiples operaciones (subprocesos) debían completarse antes de continuar, me di cuenta de que iba a ser un poco de un truco para lograr que haga esto.

Seguí la publicación de ajmastrean y me di cuenta de que realmente debería usar la clase Thread para trabajar con operaciones simultáneas. Ahora voy a refactorizar usando este método (aunque sea un enfoque diferente).


Tu idea debería funcionar bien. Básicamente, solo quiere generar un montón de hilos y asegurarse de que los que escriben el archivo tarden lo suficiente como para hacerlo para hacer esperar a los lectores. Si todos sus hilos vuelven sin error, y sin bloquear para siempre, entonces la prueba tiene éxito.


En .NET, los hilos ThreadPool no volverán sin configurar ManualResetEvent o AutoResetEvent s. Encuentro estos excesos para un método de prueba rápido (por no mencionar complicado de crear, configurar y administrar). El trabajador de segundo plano también es un poco complejo con las devoluciones de llamada y demás.

Algo que he encontrado que funciona es

  1. Crea una matriz de hilos.
  2. Configure el método ThreadStart de cada hilo.
  3. Comience cada hilo.
  4. Únete a todos los hilos (bloquea el hilo actual hasta que todos los otros hilos se completen o cancelen)

public static void MultiThreadedTest() { Thread[] threads = new Thread[count]; for (int i = 0; i < threads.Length; i++) { threads[i] = new Thread(DoSomeWork()); } foreach(Thread thread in threads) { thread.Start(); } foreach(Thread thread in threads) { thread.Join(); } }