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


    问题来源:

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

    异常处理:

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

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

    需要先引用命名空间 using System.Threading; 然后我把代码改成了下面这样就没有报错啦。 1 private void PictureBox_Click(object sender, EventArgs e)

     1 private void PictureBox_Click(object sender, EventArgs e)
     2 {
     3     //错误内容: 在可以调用OLE之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute。
     4     Thread thread = new Thread(new ThreadStart(PictureDialog));
     5     thread.SetApartmentState(ApartmentState.STA); //重点
     6     thread.Start();    
     7 }
     8 
     9 public void PictureDialog()   //打开一个选择图片的对话框
    10 {
    11     OpenFileDialog openfile = new OpenFileDialog();
    12     openfile.Title = "选择头像";   //左上角标题
    13     openfile.Filter = "图片(*.jpg;*.bmp;*png)|*.jpeg;*.jpg;*.bmp;*.png|所有文件(*.*)|*.*";  //可供选择的文件类型
    14     if (openfile.ShowDialog() == DialogResult.OK)
    15     {
    16         pictureBox.Image = Image.FromFile(openfile.FileName);
    17         pictureBox.SizeMode = PictureBoxSizeMode.Zoom;   //显示图片时按照原比例放大缩小
    18         photo = openfile.FileName;
    19     }
    20 }

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

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

     
     1 private void PictureBox_Click(object sender, EventArgs e)
     2 {
     3     if(isVirgin)
     4     {
     5         Thread thread = new Thread(new ThreadStart(PictureDialog));
     6         thread.SetApartmentState(ApartmentState.STA); //重点
     7         thread.Start();
     8         isVirgin = false;
     9     }
    10 }
    11 
    12 public void PictureDialog()   //打开一个选择图片的对话框
    13 {
    14     OpenFileDialog openfile = new OpenFileDialog();
    15     openfile.Title = "选择头像";   //左上角标题
    16     openfile.Filter = "图片(*.jpg;*.bmp;*png)|*.jpeg;*.jpg;*.bmp;*.png|所有文件(*.*)|*.*";  //可供选择的文件类型
    17     if (openfile.ShowDialog() == DialogResult.OK)
    18     {
    19         pictureBox.Image = Image.FromFile(openfile.FileName);
    20         pictureBox.SizeMode = PictureBoxSizeMode.Zoom;   //显示图片时按照原比例放大缩小
    21         photo = openfile.FileName;
    22     }
    23     isVirgin = true;
    24 }
  • 相关阅读:
    linux的性能优化
    linux日志分析
    rsyslog日志服务的配置文件分析
    Unix 入门
    Linux常用快捷键
    Linux常用命令大全
    ueditor 实现ctrl+v粘贴图片并上传、word粘贴带图片
    本地图文直接复制到WordPress编辑器中
    本地图文直接复制到Blog编辑器中
    http大文件上传(切片)
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14297113.html
Copyright © 2020-2023  润新知