2012-02-10 51 views
1

好日子,FolderBrowseDialog STAThread錯誤在後臺工作

我得到非常相似,這裏討論(這裏其它來源和其他地方中)的一個錯誤:STAThread missing, but it is there

不同的是,在我的情況我正在使用多線程。 A BackgroundWorker正在生成文檔,完成後,將彈出一個FolderBrowseDialog以允許用戶選擇一個位置來保存生成的文檔。所以我可以理解爲什麼我收到這個錯誤。我選擇將FolderBrowseDialog放入BackgroundWorker事件和相關代碼的原因是因爲我可以直接訪問路徑,而不是將字符串從一個線程傳遞到另一個線程。

雖然有趣的事情,PrintDialog工程,但SaveFileDialogFolderBrowseDialog將引發此錯誤。

我只想聽聽你的想法。將FolderBrowseDialog移出BackgroundWorker代碼最好嗎?我是否應該實施自定義FolderBrowseDialog?有沒有辦法解決?

在此先感謝您的意見和建議,並感謝大家花時間考慮我的問題;非常感激。

親切的問候

回答

2

是對FolderBrowseDialog被稱爲在RunWorkerCompleted回調抑或是被稱爲在DoWork回調?如果您從DoWork回調中調用它,則需要使用BackgroundWorker創建的SynchronizationContext,並使用Send方法顯示FolderBrowseDialog。

http://thedersen.com/2010/05/23/showing-modal-dialogs-from-a-background-thread/是我可以在網上找到的最接近的例子。在這個例子中,Worker類用於存儲SynchronizationContext。

+0

太棒了,thanx!我使用這種方法並找出答案。不知道這是否是最好的解決方案,但我使用'Worker.RunWorkerAsync(SynchronizationContext.Current)'開始了我的'BackgroundWorker''',然後在'DoWork'事件處理程序中,我將'DoWorkEventArgs''Argument'對象解開爲'SynchronizationContext'並用它來顯示對話框。這是如何完成的?它有效,但我不知道它是「好習慣」還是「標準慣例」:) – that0th3rGuy 2012-02-10 12:44:55