Frage

diese Art folgt einer anderen Frage von mir.

Sobald ich den Code für den Zugriff auf die Datei habe (ich werde die Antworten dort in einer Minute durchsehen), was wäre im Grunde der beste Weg prüfen Es?

Ich denke darüber nach, eine Methode zu entwickeln, die einfach viele hervorbringt Hintergrundarbeiter's oder so und teilt ihnen allen mit, die Datei zu laden/speichern und mit unterschiedlichen Datei-/Objektgrößen zu testen.Erhalten Sie dann eine Antwort von den Threads, um zu sehen, ob es fehlgeschlagen/erfolgreich war/die Welt implodieren ließ usw.

Könnt ihr Vorschläge machen, wie man das am besten angeht?Wie ich schon sagte, das ist alles irgendwie neu für mich :)

Bearbeiten

Nachfolgend Ajmastreans Post:

Ich verwende eine Konsolen-App zum Testen mit Debug.Asserts :)


Aktualisieren

Ich habe ursprünglich mit der Verwendung gerollt Hintergrundarbeiter Um mit dem Threading klarzukommen (da ich das von Windows-Entwicklern gewohnt bin), wurde mir schnell klar, dass mir klar wurde, dass es eine Art Hack sein würde, als ich Tests durchführte, bei denen mehrere Operationen (Threads) abgeschlossen werden mussten, bevor ich fortfahren konnte Bringen Sie es dazu, dies zu tun.

Ich habe dann weitergemacht ajmastrean's Beitrag und mir wurde klar, dass ich das wirklich verwenden sollte Faden Klasse für die Arbeit mit gleichzeitigen Operationen.Ich werde jetzt mit dieser Methode umgestalten (wenn auch mit einem anderen Ansatz).

War es hilfreich?

Lösung

In .NET, ThreadPool Threads werden ohne Einrichtung nicht zurückgegeben ManualResetEvents oder AutoResetEventS.Ich finde diese für eine schnelle Testmethode übertrieben (ganz zu schweigen davon, dass sie etwas kompliziert zu erstellen, einzurichten und zu verwalten sind).Hintergrundarbeiter sind auch etwas komplex mit Rückrufen und dergleichen.

Etwas, das ich gefunden habe und das funktioniert, ist

  1. Erstellen Sie ein Array von Threads.
  2. Richten Sie das ein ThreadStart Methode jedes Threads.
  3. Starten Sie jeden Thread.
  4. An allen Threads teilnehmen (blockiert den aktuellen Thread, bis alle anderen Threads abgeschlossen oder abgebrochen sind)
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();
    }
}

Andere Tipps

@ajmastrean, da das Ergebnis des Unit-Tests vorhersehbar sein muss, müssen wir Threads irgendwie synchronisieren.Ich kann mir keinen einfachen Weg vorstellen, dies ohne die Verwendung von Ereignissen zu tun.

Ich habe festgestellt, dass ThreadPool.QueueUserWorkItem mir eine einfache Möglichkeit bietet, solche Anwendungsfälle zu testen

 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");
    }
});

Ihre Idee sollte gut funktionieren.Im Grunde möchten Sie nur eine Reihe von Threads erzeugen und sicherstellen, dass diejenigen, die die Datei schreiben, lange genug brauchen, um die Leser tatsächlich warten zu lassen.Wenn alle Ihre Threads ohne Fehler und ohne dauerhafte Blockierung zurückkehren, ist der Test erfolgreich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top