我在顯示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