2010-05-31 101 views

回答

3

所有的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(); 
    } 

意识到你不能设置对话框的所有者,它容易被其他应用程序的窗口后面丢失。这使得在工作线程上显示表单或对话并不是一个好主意。

+0

伟大的..我可以做这样的事情:如果在工作线程中发生异常,然后1.停止进一步的过程,即线程2.以某种方式通知主线程发生异常与/使该主题线程可用的Exception对象3.然后从主线程调用FolderBrowserDialog。 ??如果是的话,请给我一些提示如何做到这一点。 – Manish 2010-06-01 07:49:36

+0

您想在发生异常时显示输入对话框?这是非常不明智的。当用户找出对话意味着什么的时候,她会完全忘记她做了什么来引起异常。使用AppData文件夹来存储日志文件。 – 2010-06-01 07:57:09

2

我不知道你为什么会想做这个。在工作线程上,所有必要的计算值都应该可用。用户交互不需要获得更多的输入。
也许重新设计会对你的情况更有帮助。考虑在启动它之前将选定的文件夹提供给您的工作线程。

EDIT(回复评论):
如果你想要做一些记录我的回答仍然适用。您的工作线程应该知道在哪里记录异常,而不是开始询问用户。
你使用日志框架吗?如果没有,请参阅log4net。在这里,您通常在xml文件中预先配置您的日志记录(日志级别,路径,格式,...)。不需要用户交互。尽管用户可以更改日志记录路径(在xml文件中)。

+0

我想在工作线程进程中记录异常,为此我需要从用户处取文件夹的路径。 – Manish 2010-05-31 10:43:42

+0

这就是我不想做的:硬编码!我想让用户有权指定一个文件夹并在文本文件中记录那里的异常。是的,我确实使用了日志框架。 – Manish 2010-05-31 10:56:54

+0

@Manish:但将其写入xml文件不是硬编码......它可以很容易地更改。你甚至可以提供程序的选项路径... – tanascius 2010-05-31 11:04:25