FolderBrowserDialog
UI以外のスレッドから作成および呼び出されたインスタンスを表示する際に問題が発生しています。正しくレンダリングされません。
具体的には、フォルダツリーは表示されず、Make New Folder OKとのみが表示されます。Cancel
FolderBrowserDialog
UI以外のスレッドから作成および呼び出されたインスタンスを表示する際に問題が発生しています。正しくレンダリングされません。
具体的には、フォルダツリーは表示されず、Make New Folder OKとのみが表示されます。Cancel
FolderBrowserDialogを含むすべてのシェルダイアログでは、スレッドのCOMアパートメントをSTAに設定する必要があります。Thread.SetApartmentState()呼び出しが欠落している可能性があります。
private void button1_Click(object sender, EventArgs e) {
var t = new Thread(() => new FolderBrowserDialog().ShowDialog());
t.IsBackground = true;
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
ダイアログの所有者を設定できないことに注意してください。ダイアログは別のアプリケーションのウィンドウの背後で簡単に失われます。そのため、ワーカースレッドにフォームやダイアログを表示するのは良い考えではありません。
なぜあなたがこれをしたいかわかりません。ワーカースレッドでは、計算に必要なすべての値が利用可能である必要があります。より多くの入力を取得するためにユーザーの操作を行う必要はありません。
たぶん、あなたの場合、再設計がより役立つでしょう。開始する前に、選択したフォルダーをワーカースレッドに提供することを検討してください。
編集(コメントに返信):
ログを記録したい場合でも、私の答えが当てはまります。ワーカースレッドは、例外をログに記録する場所を知っている必要があり、ユーザーへの質問を開始しないようにする必要があります。
ロギングフレームワークを使用していますか?そうでない場合は、たとえばlog4netを見てください。ここでは通常、xmlファイルでログ(ログレベル、パス、形式など)を事前に構成します。ユーザーの操作は必要ありません。ただし、ユーザーは(xmlファイル内の)ロギングパスを変更できます。