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)

  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. }

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值