C#異常:在調用OLE之前,必須將當前線程設置為單線程單單元(STA)模式。

  • 2019 年 11 月 7 日
  • 筆記

問題來源:

昨晚上在調試數據庫大作業的時候,我在註冊界面Register里點擊"上傳頭像"這個linklabel時,程序出現了一個異常:在調用OLE之前,必須將當前線程設置為單線程單單元(STA)模式。請確保您的 Main 函數帶有 STAThreadAttribute 標記。只有將調試程序附加到該進程才會引發此異常。( 如圖所示 )。

異常處理:

鏈接1:在可以調用 OLE 之前,必須將當前線程設置為單線程單元(STA)模式

鏈接2:在可以調用OLE之前,必須將當前線程設置為單線程單元(STA)模式,請確保您的Main函數帶有STAThreadAttribute

需要先引用命名空間 using System.Threading; 然後我把代碼改成了下面這樣就沒有報錯啦。

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 語句。

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