前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#异常:在调用OLE之前,必须将当前线程设置为单线程单单元(STA)模式。

C#异常:在调用OLE之前,必须将当前线程设置为单线程单单元(STA)模式。

作者头像
喜欢ctrl的cxk
发布2019-11-07 21:27:00
4.4K1
发布2019-11-07 21:27:00
举报
文章被收录于专栏:Don的成长史

问题来源:

昨晚上在调试数据库大作业的时候,我在注册界面Register里点击"上传头像"这个linklabel时,程序出现了一个异常:在调用OLE之前,必须将当前线程设置为单线程单单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。只有将调试程序附加到该进程才会引发此异常。( 如图所示 )。

异常处理:

链接1:在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式

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

需要先引用命名空间 using System.Threading; 然后我把代码改成了下面这样就没有报错啦。

代码语言:javascript
复制
private void PictureBox_Click(object sender, EventArgs e)
{
    //错误内容: 在可以调用OLE之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute。
    Thread thread = new Thread(new ThreadStart(PictureDialog));
    thread.SetApartmentState(ApartmentState.STA); //重点
    thread.Start();    
}

public void PictureDialog()   //打开一个选择图片的对话框
{
    OpenFileDialog openfile = new OpenFileDialog();
    openfile.Title = "选择头像";   //左上角标题
    openfile.Filter = "图片(*.jpg;*.bmp;*png)|*.jpeg;*.jpg;*.bmp;*.png|所有文件(*.*)|*.*";  //可供选择的文件类型
    if (openfile.ShowDialog() == DialogResult.OK)
    {
        pictureBox.Image = Image.FromFile(openfile.FileName);
        pictureBox.SizeMode = PictureBoxSizeMode.Zoom;   //显示图片时按照原比例放大缩小
        photo = openfile.FileName;
    }
}

然而!这样改了之后出现了一个新的bug:只要我一直点"上传头像"这个linkliable,它就会一直弹出对话框让我选择图片,我点了三下"上传头像",效果如图所示。这不是我想要的结果,按理来说,我们只能允许它出现一个"选择头像"的对话框。

修改的方法很简单,我在这个窗体的代码中加了一个bool型变量isVirgin(不要问为什么取这个名字,问就是用来判断是不是第一次点击"上传头像"),然后添加了俩条 if 语句。

代码语言:javascript
复制
private void PictureBox_Click(object sender, EventArgs e)
{
    if(isVirgin)
    {
        Thread thread = new Thread(new ThreadStart(PictureDialog));
        thread.SetApartmentState(ApartmentState.STA); //重点
        thread.Start();
        isVirgin = false;
    }
}

public void PictureDialog()   //打开一个选择图片的对话框
{
    OpenFileDialog openfile = new OpenFileDialog();
    openfile.Title = "选择头像";   //左上角标题
    openfile.Filter = "图片(*.jpg;*.bmp;*png)|*.jpeg;*.jpg;*.bmp;*.png|所有文件(*.*)|*.*";  //可供选择的文件类型
    if (openfile.ShowDialog() == DialogResult.OK)
    {
        pictureBox.Image = Image.FromFile(openfile.FileName);
        pictureBox.SizeMode = PictureBoxSizeMode.Zoom;   //显示图片时按照原比例放大缩小
        photo = openfile.FileName;
    }
    isVirgin = true;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/06/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题来源:
  • 异常处理:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档