2010-05-31 43 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