Beim aufrufenden Thread muss es sich um einen STA-Thread handeln

  • WPF

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    Beim aufrufenden Thread muss es sich um einen STA-Thread handeln

    Hallo Leute und danke fürs reinschauen...

    hab ein Problem, dass ich nicht lösen weis:

    Mein Programm soll im Hintergrund was machen. Es ist mir ganz wichtig, dass es in einem Hintergrund-Prozess passiert. Unter Anderem soll im Hintergrund was gedruckt werden.

    Jetzt starte ich so mein Hintergrundprozess:

    C#-Quellcode

    1. ​Task.Factory.StartNew(() => UpdateDB(user));


    Funktioniert auch gut, aber wenn der Versucht für den Drucker die Items herzustellen, greift der natürlich auf Visuelle objekte zu und stellt so einen DIN A4 Blatt zusammen aus verschieden Controls.
    DIESE VISUELLE OBJEKTE SIND KEINE INSTANZEN DES PROGRAMMS, sondern werden neu erstellt und zusammengefügt.

    Dennoch kriege ich mitten bei der Zusammenstellung eine Exeption:Beim aufrufenden Thread muss es sich um einen STA-Thread handeln, da dies für viele Komponenten der Benutzeroberfläche erforderlich ist.

    Was kann ich machen? Danke im Voraus.
    Nur ganz kurz: Dauergroßschrift = schreien. Ich hab instinktiv meinen Kopf zurückgezogen, als ich jenen Text las.
    btt: Im Hintergrund sollen CEs erstellt und diese dann gedruckt werden. Hab ich die Frage richtig verstanden? "wenn der Versucht für den Drucker die Items herzustellen" -> Du druckst also Formularlayouts? Kannst Du einen paar Codezeilen posten, bei denen im HG-Prozess dann die Exception kommt?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nun ja, ich schreie nicht, ich schreibe groß was sehr wichtig ist...

    C#-Quellcode

    1. private void PrintItemsIntern()
    2. {
    3. try
    4. {
    5. csPrintItem_10 tmp = null;
    6. for (int i = 0; i < ListOfvPrint.Count; i++)
    7. {
    8. if (tmp == null)
    9. {
    10. tmp = new csPrintItem_10(); <---- hier kommt es bereits.
    11. tmp.vPrint = ListOfvPrint[i];
    12. }
    13. ...
    14. ...


    dahinter ist ganz normaler Konstruktor für WPF-Zeug.
    Nimm doch statt dem Task nen normalen Thread, da kannste ganz einfach den Apartmentstate festlegen

    VB.NET-Quellcode

    1. mainThread.SetApartmentState(ApartmentState.STA)
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    EugenIS schrieb:

    Was kann ich machen?
    Starte einen klassischen Thread, dem kannst Du dann Deine Attribute geben, so sieht das bei C# aus:

    C#-Quellcode

    1. [STAThread]
    2. static void Main()
    3. {
    4. Application.EnableVisualStyles();
    5. Application.SetCompatibleTextRenderingDefault(false);
    6. Application.Run(new Form1());
    7. }

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ich kanns leider nur auf die VB.net weise erklären, C# ist glaub ich die Erklärung von @RodFromGermany aus Post 5

    VB.Net:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim mainThread As Thread
    2. mainThread = New Thread(Sub() UpdateDB(user))
    3. mainThread.SetApartmentState(ApartmentState.STA)
    4. mainThread.Start()


    C# (telrik.converter)
    Spoiler anzeigen

    C#-Quellcode

    1. Thread mainThread = default(Thread);
    2. mainThread = new Thread(() => UpdateDB(user));
    3. mainThread.SetApartmentState(ApartmentState.STA);
    4. mainThread.Start();

    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    asusdk schrieb:

    Nimm doch statt dem Task nen normalen Thread, da kannste ganz einfach den Apartmentstate festlegen

    Was du schön bleiben lässt.
    Arbeite mit Invoke und nicht mit solch dubiosen Mitteln.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.