我在显示FolderBrowserDialog
创建并从非UI线程调用的实例时遇到了问题。它不能正确渲染。是不可能从非UI线程显示FolderBrowserDialog?
作为更具体的,它不显示文件夹树,但只显示新建文件夹OK和取消
alt text http://i49.tinypic.com/51dbog.png
我在显示FolderBrowserDialog
创建并从非UI线程调用的实例时遇到了问题。它不能正确渲染。是不可能从非UI线程显示FolderBrowserDialog?
作为更具体的,它不显示文件夹树,但只显示新建文件夹OK和取消
alt text http://i49.tinypic.com/51dbog.png
所有的shell对话框,包括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();
}
意识到你不能设置对话框的所有者,它容易被其他应用程序的窗口后面丢失。这使得在工作线程上显示表单或对话并不是一个好主意。
我不知道你为什么会想做这个。在工作线程上,所有必要的计算值都应该可用。用户交互不需要获得更多的输入。
也许重新设计会对你的情况更有帮助。考虑在启动它之前将选定的文件夹提供给您的工作线程。
EDIT(回复评论):
如果你想要做一些记录我的回答仍然适用。您的工作线程应该知道在哪里记录异常,而不是开始询问用户。
你使用日志框架吗?如果没有,请参阅log4net。在这里,您通常在xml文件中预先配置您的日志记录(日志级别,路径,格式,...)。不需要用户交互。尽管用户可以更改日志记录路径(在xml文件中)。
伟大的..我可以做这样的事情:如果在工作线程中发生异常,然后1.停止进一步的过程,即线程2.以某种方式通知主线程发生异常与/使该主题线程可用的Exception对象3.然后从主线程调用FolderBrowserDialog。 ??如果是的话,请给我一些提示如何做到这一点。 – Manish 2010-06-01 07:49:36
您想在发生异常时显示输入对话框?这是非常不明智的。当用户找出对话意味着什么的时候,她会完全忘记她做了什么来引起异常。使用AppData文件夹来存储日志文件。 – 2010-06-01 07:57:09