Pregunta

este tipo de continuación de otro pregunta mío.

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 hacerlo? prueba ¿él?

Estoy pensando en crear un método que genere muchos FondoTrabajador's o algo así y les dice que carguen/guarden el archivo y que lo 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 implosionara, etc.

¿Pueden ofrecernos alguna sugerencia sobre la mejor manera de abordar esto?Como dije antes, todo esto es un poco nuevo para mí :)

Editar

Siguiente ajmastrean correo:

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


Actualizar

Originalmente utilicé el uso FondoTrabajador para lidiar con los subprocesos (ya que estoy acostumbrado a eso desde el desarrollador de Windows) pronto me di cuenta de que cuando estaba realizando pruebas en las que debían completarse varias operaciones (subprocesos) antes de continuar, me di cuenta de que iba a ser un poco complicado conseguir que haga esto.

Luego seguí ajmastrean's post y me di cuenta de que realmente debería usar el Hilo clase para trabajar con operaciones concurrentes.Ahora refactorizaré usando este método (aunque con un enfoque diferente).

¿Fue útil?

Solución

En la red, ThreadPool Los hilos no volverán sin configurar. ManualResetEvents o AutoResetEvents.Estos me parecen excesivos para un método de prueba rápido (sin mencionar que son algo complicados de crear, configurar y administrar).El trabajador en 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 serie de hilos.
  2. Configurar el ThreadStart método de cada hilo.
  3. Inicie cada hilo.
  4. Unirse a todos los hilos (bloquea el hilo actual hasta que todos los demás hilos se completen o aborten)
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();
    }
}

Otros consejos

@ajmastrean, dado que el resultado de la prueba unitaria debe ser predecible, necesitamos sincronizar los subprocesos de alguna manera.No veo una forma sencilla de hacerlo sin utilizar eventos.

Descubrí que ThreadPool.QueueUserWorkItem me brinda una manera fácil de probar dichos 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");
    }
});

Tu idea debería funcionar bien.Básicamente, solo desea generar un montón de hilos y asegurarse de que los que escriben el archivo tomen el tiempo suficiente para hacerlo para que los lectores esperen.Si todos sus hilos regresan sin errores y sin bloquearse para siempre, entonces la prueba es exitosa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top