C# 后台工作程序中的FolderBrowseDialog STAThread错误
你好 我得到了一个与这里讨论的非常相似的错误(在这里和其他地方的其他来源中): 区别在于,在我的例子中,我使用多线程。C# 后台工作程序中的FolderBrowseDialog STAThread错误,c#,winforms,multithreading,folderbrowserdialog,C#,Winforms,Multithreading,Folderbrowserdialog,你好 我得到了一个与这里讨论的非常相似的错误(在这里和其他地方的其他来源中): 区别在于,在我的例子中,我使用多线程。BackgroundWorker正在生成文档,完成后,将弹出一个FolderBrowseDialog,允许用户选择保存生成文档的位置。所以我能理解为什么我会收到这个错误。我之所以选择将folderbrowseddialog放入BackgroundWorker事件和相关代码中,是因为这样我就可以直接访问路径,而不是将字符串从一个线程传递到另一个线程 有趣的是,PrintDialog
BackgroundWorker
正在生成文档,完成后,将弹出一个FolderBrowseDialog
,允许用户选择保存生成文档的位置。所以我能理解为什么我会收到这个错误。我之所以选择将folderbrowseddialog
放入BackgroundWorker
事件和相关代码中,是因为这样我就可以直接访问路径,而不是将字符串从一个线程传递到另一个线程
有趣的是,PrintDialog
可以工作,但是SaveFileDialog
和FolderBrowseDialog
抛出了这个错误
我只想听听你的想法。是否最好将文件夹浏览对话框
移出BackgroundWorker
代码?我是否应该实现自定义的文件夹浏览对话框
?这有什么办法吗
提前感谢大家的意见和建议,并请大家花时间考虑我的问题;非常感谢
是在回调中调用FolderBrowseDialog,还是在回调中调用FolderBrowseDialog?如果您是从DoWork回调调用它,则需要使用在中创建的BackgroundWorker,并使用该方法显示FolderBrowseDialog
这是我在网上能找到的最接近的例子。在该示例中,Worker类用于存储SynchronizationContext。太棒了,thanx!我用这种方法解决了这个问题。不确定这是否是最佳解决方案,但我使用
Worker.RunWorkerAsync(SynchronizationContext.Current)
启动了我的BackgroundWorker
,然后在DoWork
事件处理程序中,我将dowworkeventargs
参数
对象取消装箱到SynchronizationContext
并使用它显示对话框。是这样做的吗?它是有效的,但我不知道它是“良好实践”还是“标准惯例”: