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