【问题标题】:FolderBrowseDialog STAThread error in background worker后台工作人员中的 FolderBrowseDialog STAThread 错误
【发布时间】:2012-02-10 10:53:26
【问题描述】:

早安,

我收到的错误与此处讨论的错误非常相似(此处和其他地方的其他来源):STAThread missing, but it is there

不同之处在于,就我而言,我使用的是多线程。 BackgroundWorker 正在生成文档,完成后,FolderBrowseDialog 将弹出以允许用户选择保存生成文档的位置。所以我可以理解为什么我会收到这个错误。我之所以选择将FolderBrowseDialog 放在BackgroundWorker 事件和相关代码中,是因为我可以直接访问路径,而不是将字符串从一个线程传递到另一个线程。

有趣的是,PrintDialog 有效,但 SaveFileDialogFolderBrowseDialog 抛出此错误。

我只是想听听你的想法。最好将FolderBrowseDialog 移出BackgroundWorker 代码吗?我应该实现自定义FolderBrowseDialog 吗?有没有办法解决这个问题?

提前感谢 cmets 和建议以及花时间考虑我的问题的每个人;非常感谢。

亲切的问候

【问题讨论】:

    标签: c# winforms multithreading folderbrowserdialog


    【解决方案1】:

    FolderBrowseDialog 是在RunWorkerCompleted 回调中调用还是在DoWork 回调中调用?如果您从 DoWork 回调中调用它,则需要使用创建 BackgroundWorker 的 SynchronizationContext 并使用 Send 方法显示 FolderBrowseDialog。

    http://thedersen.com/2010/05/23/showing-modal-dialogs-from-a-background-thread/ 是我在网上能找到的最接近的例子。在该示例中,Worker 类用于存储 SynchronizationContext。

    【讨论】:

    • 太棒了,谢谢!我使用了这种方法并想通了。不确定这是否是最好的解决方案,但我以Worker.RunWorkerAsync(SynchronizationContext.Current) 开始我的BackgroundWorker,然后在DoWork 事件处理程序中,我将DoWorkEventArgs Argument 对象拆箱到SynchronizationContext 并使用它来显示对话框。是这样完成的吗?它有效,但我不知道它是“良好做法”还是“标准约定”:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2014-04-14
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多