zl程序教程

您现在的位置是:首页 >  后端

当前栏目

多线程下调用ShowDialog时异常原因及解决办法

多线程异常 调用 解决办法 原因
2023-09-11 14:16:45 时间

提示在可以调用OLE之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute

导入导出功能,在调用ShowDialog时的错误,解决办法如下:

WinForm窗体的入口点:

复制代码

        /// <summary>
        /// 应用程序的主入口点加入 [STAThread]。
        /// </summary>
        [STAThread]
        private static void Main(String[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new LoginForm());
        }   

复制代码

修改如下:Thread线程调用SetApartmentState(ApartmentState.STA)设置 //重点

                 此种报错情况下就不能用Task创建线程了,因为Task没有SetApartmentState方法

复制代码

    public string importPath=""; //全局变量,用于显示导入文件路劲

        private void btnImport_Click(object sender, EventArgs e)
        {
            Thread importThread = new Thread(new ThreadStart(ImportDialog));
            importThread.SetApartmentState(ApartmentState.STA); //重点
            importThread.Start();
            txtImportPath.Text = importPath;
        }
        public void ImportDialog()
        {
            OpenFileDialog open = new OpenFileDialog();
            open.Filter = "Excel文件|*.xls;*.xlsx";
            if (open.ShowDialog() == DialogResult.OK)
            {
                importPath = open.FileName;

                ReadExcelToTable(importPath);
                UpdateArea();
            }
        }

复制代码