3.この属性を削除するとどうなりますか?
問題を示す簡単な例を追加します。
ボタンとOpenFileDialogで簡単なWinFormsアプリケーションを作成しました。ボタンをクリックすると、openFileDialogを示すスレッドが実行されます。私は、STAThreadの有無にかかわらずアプリを起動し、ボタンをクリックした結果は同じです。「クロススレッド操作が無効です:コントロール 'フォーム1」が作成されたスレッド以外のスレッドからアクセスされました。 違いがないように見えます。しかし、いいえ。予想通り、それは正常に動作STAThreadで
private void ShowOFD()
{
if (InvokeRequired)
{
BeginInvoke(new Action(ShowOFD));
return;
}
openFileDialog1.ShowDialog(this);
}
:
は、その後、私は以下のメソッドを呼び出すことによってopenFileDialogを示す変更しました。 STAThreadを使用しない場合、例外がスローされます "現在のスレッドは、OLE呼び出しを行う前にシングルスレッドアパートメント(STA)モードに設定する必要があります。メイン関数にSTAThreadAttributeが設定されていることを確認してください。 「プロセスに」。
その後、私はデバッガなしで(ビジュアルスタジオから切り離された)アプリを何度も起動します。アプリがただ静かに閉じたとき、別の時に "vshostが動作を停止しました"というメッセージで閉じられたとき
可能な複製:http://stackoverflow.com/questions/102437/why-do-all-winforms-programs-require-the-stathread-attribute –
@Cody:はい、申し訳ありませんが、私はそれを見ましたが、IMHOこの答えは他のものよりずっと優れています。 –
ええ、そうです。私はそれらの答えが幻想的ではなかったので、閉会に投票しませんでした。その質問から得られる最も重要な知識は、このリンクです。http://blogs.msdn.com/b/jfoscoding/archive/2005/04/07/406341.aspx –