问题来源:
昨晚上在调试数据库大作业的时候,我在注册界面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 }