【问题标题】:Creating a save dialog in the same thread as the main window在与主窗口相同的线程中创建保存对话框
【发布时间】:2014-01-09 04:28:40
【问题描述】:

我想知道是否有任何简单的方法可以让保存文件对话框在与我的程序主窗口相同的线程中运行?

private void saveAs_click(object sender, EventArgs e)
{
    System.Windows.Forms.SaveFileDialog saveDiag = new System.Windows.Forms.SaveFileDialog();
    saveDiag.ShowDialog();
}

我收到以下错误:

System.Windows.Forms.dll 中出现“System.Threading.ThreadStateException”类型的未处理异常

附加信息:在进行 OLE 调用之前,当前线程必须设置为单线程单元 (STA) 模式。确保您的 Main 函数上标记了 STAThreadAttribute。仅当将调试器附加到进程时才会引发此异常。

我创建了一个我调用的关于对话框:

private static void aboutThreadProc()
{
     Application.Run(new aboutDialog());
}

但我想避免在保存对话框中再次执行此操作,除非有人知道将用户输入对话框的信息传递回主程序的简单方法??

抱歉,我的进程和线程在这里有点混乱,考虑到这是我编写的第一个 GUI 应用程序,我真的很困惑,所以我还不知道如何让所有东西都进行通信。

编辑:

我的主窗口是这样启动的:

[STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        resultsStore workingStore = new resultsStore();

        System.Threading.Thread mainThread = new System.Threading.Thread(new System.Threading.ThreadStart(mainThreadProc));
        mainThread.Start();
    }

private static void mainThreadProc()
{
        Application.Run(new main());
    }

接受任何建议

【问题讨论】:

  • 您提供的任何内容都不会导致此错误发生。你在某处产生一个线程吗?
  • 你好,我添加了一些相关信息,谢谢!
  • 产生自己的“主线程”的目的是什么?已经有一个主线程可以为您泵送窗口消息。那是你的问题。删除它,只使用没有线程的Application.Run(new main());
  • 我不记得为什么了,但是已经解决了,谢谢!

标签: c# multithreading user-interface dialog sta


【解决方案1】:

解决方案:

产生自己的“主线程”的目的是什么?已经有一个主线程可以为您泵送窗口消息。那是你的问题。删除它,只需 Application.Run(new main());没有线程。 – Simon Whitehead 10 分钟前

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多