2016-04-25 10 views
0

Ich habe eine perfekt funktionierende Anwendung, außer in ONE Computer. In diesem Computer stürzt die Anwendung ab, wenn sich ein SaveFileDialog öffnet. Keine Fehler, keine Ausnahmen.Windows Form UI Thread Problem C#

Nach einigen Nachforschungen fand ich, dass ein Weg, um diesen Absturz zu beheben ist, diese SaveFileDialog in einem neuen Thread zu machen.

static void open(object name) 
{ 
    SaveFileDialog saveFileDialog1 = new SaveFileDialog(); 
    saveFileDialog1.Filter = "Microsoft Word Document (.docx)|*.docx"; 
    saveFileDialog1.FilterIndex = 2; 
    saveFileDialog1.RestoreDirectory = true; 
    saveFileDialog1.Title = "Where to save the " + (string)name + " ? "; 
    try 
    { 
     th.IsBackground = false;  
     boule = saveFileDialog1.ShowDialog() == DialogResult.OK; 
     ptth = saveFileDialog1.FileName;    
    } 
    catch (Exception exc) 
    { MessageBox.Show(exc.Message); } 
} 

Ich habe dies in der Veranstaltung:

Thread th = new Thread(new ParameterizedThreadStart(open)); 
th.Start("Quotation"); 

Das Problem ist, dass ich einen Fehler haben

aktuellen Thread muss einzelnen Thread Apartment (STA) Modus vor OLE eingestellt werden ...

Also habe ich überprüft und ich habe die "[STAT hret] "vor meinem Main. Also habe ich diese Zeile in der „offenen“ Verfahren:

th.SetApartmentState(ApartmentState.STA); 

Aber ein neuer Fehler angezeigt:

Fehler beim angegebenen COM-Apartmentzustand

setzen

Was habe ich falsch gemacht ? Wie erstelle ich einen richtigen UI-Thread? Gibt es einen leichteren Weg?

EDIT: Es ist noch seltsamer, weil ich in der App einen OpenFileDialog verwende, um ein Bild zu bekommen, und es funktioniert perfekt. Ist es nur ein Problem für SaveFileDialog? Kommt es von etwas anderem?

+0

Ich sah die Antwort einen neuen Thread empfehlen, und es sieht fraglich aus. Ein Dialogfeld * sollte * auf dem UIhread sein. Wenn etwas aus einem unbekannten Grund nicht funktioniert, ist es sehr unwahrscheinlich, dass es in einem neuen Thread ausgeführt wird, aber es könnte neue Probleme verursachen. –

+0

Ja, ich bin mir nicht sicher, aber Tatsache ist, dass die App abstürzt und ich es beheben muss ... Vielleicht weiß jemand einen anderen Weg, um es zum Laufen zu bringen, oder kann mir erklären, wie man einen richtigen Thread erstellt. – UnderPaidIntern

+0

Tritt der Savefiledialog-Absturz in einer App auf? [This] (http://superuser.com/questions/985618/save-file-dialog-viewing-libraries-crash-any-all-desktop-applications) Frage erwähnt Bibliotheken als den Schuldigen, was durch Setzen Ihrer vermieden werden kann Anfangsverzeichnis – Martheen

Antwort

0

Anstatt einen neuen Thread zu starten, können Sie ApartmentState für den aktuellen UI-Thread festlegen.

var thread = new Func<Thread>(() => { return Thread.CurrentThread; }).Invoke(); 
thread.SetApartmentState(ApartmentState.STA); 
+0

Es funktionierte auf meinem Computer (keine Ausnahmen), aber es stürzt immer noch auf dem ungeraden Computer ab. – UnderPaidIntern