C#异常解决:在调用OLE之前,必须将当前线程设置为单线程单单元(STA)模式。
問題來源:
昨晚上在調試數據庫大作業的時候,我在注冊界面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;
}
?
總結
以上是生活随笔為你收集整理的C#异常解决:在调用OLE之前,必须将当前线程设置为单线程单单元(STA)模式。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt Widgets、QML、Qt Qu
- 下一篇: Qt调用OpenCV汇总(1)