2016-04-25 6 views
0

私はONEのコンピュータを除いて、完全に動作するアプリケーションを持っています。このコンピュータでは、SaveFileDialogが開くとアプリケーションがクラッシュします。エラーも例外もありません。WindowsフォームUIスレッドの問題C#

調査の結果、このクラッシュを修正する方法の1つは、これを行うことです。SaveFileDialog新しいスレッドに追加しました。

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

私はイベントでこれを置く:

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

を問題は、私はエラー

現在のスレッドがOLE前に、シングルスレッドアパートメント(STA)モードに設定しなければならないということです...

私は確認しました。私は "[STAT hread] "前に私のメイン。だから私は、「オープン」メソッドでこの行を追加:

th.SetApartmentState(ApartmentState.STA); 

しかし、新しいエラーが表示されます。

は私が間違って何をしました指定されたCOMアパートメント状態を設定できませんでした。 ?適切なUIスレッドを作成するには?簡単な方法がありますか?

EDIT:アプリでOpenFileDialogを使用して画像を取得していて、完璧に動作するため、それはさらに奇妙です。それはSaveFileDialogのためだけの問題ですか?それは他の何かから来ていますか?

+0

新しいスレッドを推奨する回答がありました。疑問があります。ダイアログボックス*はUIスレッド上になければなりません。未知の理由で何かがうまく動作しない場合は、新しいスレッドで実行することは非常に困難ですが、新しい問題が発生する可能性があります。 –

+0

はい私はあまりにも確かではありませんが、実際にはアプリケーションがクラッシュし、修正する必要があるということです...誰かが別の方法でそれを動作させることを知っているか、適切なスレッドを作る方法を教えてください。 – UnderPaidIntern

+0

savefiledialogクラッシュはどのアプリでも起こりますか? [This](http://superuser.com/questions/985618/save-file-dialog-viewing-libraries-crash-any-all-desktop-applications)は、ライブラリを犯人として挙げています。 InitialDirectory。 – Martheen

答えて

0

新しいスレッドを開始する代わりに、現在のUIスレッドにApartmentStateを設定することができます。

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

それは私のコンピュータで動作しました(例外はありません)が、まだ奇数のコンピュータでクラッシュします。 – UnderPaidIntern

関連する問題