要在Windows窗体应用程序中使用对话框,主线程应设置为[STAThread]
,或者需要创建单独的STA线程才能运行对话框。
这是我无法理解的问题。启动的STA线程“有时”没有完成,因此主线程一直挂在Join()上。
现在我通过使用Application.DoEvents()
而不是t.Join()
来克服现在它似乎工作得很好,但我仍然会对“有时”依赖的东西感兴趣。在示例中,我使用以下静态方法打开openfile- / savefile对话框:
using System.Windows.Forms;
namespace Dialog
{
public class clsDialogState
{
public DialogResult result;
public FileDialog dialog;
public void ThreadProcShowDialog()
{
result = DialogResult.None;
result = dialog.ShowDialog();
}
}
public static class clsShowDialog
{
public static DialogResult STAShowDialog(FileDialog dialog)
{
clsDialogState state = new clsDialogState();
state.dialog = dialog;
System.Threading.Thread t = new System.Threading.Thread(state.ThreadProcShowDialog);
t.SetApartmentState(System.Threading.ApartmentState.STA);
t.Start();
//t.Join(); //Main thread might hang up here
while (state.result == DialogResult.None) Application.DoEvents(); //Everything is refreshed/repainted fine
return state.result;
}
}
}
所以用法只是:
Dialog.clsShowDialog.STAShowDialog(new SaveFileDialog());
答案 0 :(得分:1)
在等待STA线程完成时,我无法弄清楚究竟是什么使得调用线程挂起在join()上,但看起来它有时会起作用,有时却不行。最后我决定用以下方法克服:
while (InvokeResult == DialogResult.None) Application.DoEvents();
而不是Join()。