Threadpool - Problem mit GUI



  • Hallo Leute,

    ich habe einen Threadpool analog zu folgendem Beispiel geschrieben:
    http://www.switchonthecode.com/tutorials/csharp-tutorial-using-the-threadpool

    Dieses Konstrukt ist in einer eigenen Library.
    Die Library enthält eine Methode xyz(..) welche die Threads startet und mit
    WaitHandle.WaitAll(resetEvents);
    auf die Ergebnisse wartet.

    Rufe ich diese Methode über eine Konsolenanwendung auf, so funktioniert diese problemlos.

    Wenn ich nun von einer WPF Anwendung aus die Methode xyz(..) der Library aufrufe bekomme ich eine "NotSupportedException".
    In der Doku (http://msdn.microsoft.com/de-de/library/cc190864.aspx) habe ich dazu folgendes gefunden:

    Alternative 1: Die Anzahl der Objekte in waitHandles ist größer als die für das System zulässige Anzahl.

    Alternative 2: Das STAThreadAttribute-Attribut wird auf die Threadprozedur für den aktuellen Thread angewendet, und waitHandles enthält mehr als ein Element.

    Ich habe das nun überprüft. Es scheint bei mir wohl Alternative 2 zu sein. Sobald ich mindestens zwei Threads erzeuge kommt die oben genannte Exception. Mit nur einem erzeugten Thread funktioniert der Code noch.

    Kann mir bitte jemand erklären, wo genau das eigentliche Problem liegt? Die Fehlermeldung sagt mir nicht viel. Und wieso funktioniert es mit einer Konsolenanwendung, aber nicht mit einer WPF Anwendung?

    Danke euch,
    der ratlose Nico



  • Was ich noch vergessen habe. Die NotSupportedException bringt die Meldung:
    WaitAll für mehrere Handles in einem STA-Thread wird nicht unterstützt.

    Deutet also nochmals auf Alternative 2 (siehe oben) hin.

    Danke für Hilfe!


  • Administrator

    WPF und WinForms Anwendungen brauchen STAThreadAttribute für die Kommunikation mit COM Komponenten. Siehe auch kurz und knapp hier:
    http://blogs.msdn.com/b/jfoscoding/archive/2005/04/07/406341.aspx

    Für weitere Informationen zu STA musst du dich in die COM Dokumentation vorwagen, z.B. hier:
    http://msdn.microsoft.com/en-us/library/ms680112.aspx

    Eine simple Konsole braucht sowas nicht. Also ja, es ist eindeutig die zweite Alternative, sagt ja auch ganz eindeutig die Fehlermeldung.

    Grüssli



  • okay, Danke für die Infos.
    Also kann ich das so nicht schreiben. Nur wie schreibe ich das dann?

    Also ich mache in der WPF Anwendung eine Eingabe. Diese Eingabe wird in der Library verarbeitet und da dabei auf das Internet zugegriffen wird sollten alle Anfragen parallel abgearbeitet werden (daher die Threads). Das Ergebnis der Threads soll dann wieder in der WPF Anwendung angezeigt werden.

    Statt auf alle Threads zu warten, würde mir nun noch einfallen das ganze asynchron (Stichwort Callback) zu machen. Kann das damit funktionieren? Oder wie würdet ihr das realisieren?

    Habe bisher noch nie etwas asynchron geschrieben. Hat da jemand vielleicht ne gute Quelle für mich?

    Danke Nico


  • Administrator

    Die einfachste Variante:
    Nimm eine Schleife und warte auf jedes WaitHandle einzeln.

    Für weitere Lösungen müsstest du uns zuerst sagen, was du genau tust. Was heisst "auf das Internet zugreifen"? Ladest du irgendwelche Daten runter? WebClient und seine Download...Async (z.B. DownloadDataAsync ) Methoden schon entdeckt?

    Grüssli


Log in to reply