关于多线程下访问系统剪贴板的异常

youdiving 2013-04-22 09:23:16
程序中
Clipboard.SetImage(bmp);
出现ystem.Threading.ThreadStateException: 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。的异常
我main函数前边已经加了[STAThread]的标志
程序打开时由于读进内存的数据量有点多,反应有点慢,我加了一个窗体f1在f1里创建了原来程序加载窗体的方法
但原来窗体里菜单“复制为图片”菜单项出现上述异常
private void Frmloading_Load(object sender, EventArgs e)
{
mybitmap=new Bitmap("load.bmp");
this.Width = mybitmap.Width;
this.Height = mybitmap.Height;
this.StartPosition = FormStartPosition.CenterScreen;
thread1 = new Thread(new ThreadStart(FrmLogin));
//timer1.Enabled = true;
//timer1.Interval = 2000;
thread1.Start();

}



private void FrmLogin()
{
//timer1.Start();
Frmmain frmain = new Frmmain();
//frmain.Visible = false;
frmain.Show();

}
frmain的菜单出现上述异常
private void toolStripMenuItem8_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(30, 35);//创建图片
Graphics g = Graphics.FromImage(bmp);//创建画板
g.FillRectangle(new SolidBrush(Color.White), 0, 0, 30, 35);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
if (obj1 != null)
{
//将文字写入图片
StringFormat strf = new StringFormat();
strf.Alignment = StringAlignment.Center;
strf.LineAlignment = StringAlignment.Near;
g.DrawString(obj1.Text, new Font("AYSDJW", 22), new SolidBrush(Color.Black), 15, 3, strf);
bmp.Save("picture.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
Clipboard.SetImage(bmp);//出现异常我该怎么办 Image img = Clipboard.GetImage();
g.Dispose();
bmp.Dispose();
}
}
...全文
330 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
youdiving 2013-05-02
  • 打赏
  • 举报
回复
/// <summary> /// 将记录读取到lisJw泛型中 /// </summary> private void OleSelect() { string strsql = "select * from bsbm where 序号 like'%000000' order by 序号 asc"; OleDbDataReader Olesdr = data.Sqlread(strsql); while (Olesdr.Read()) { jw = new Jw(); jw.Bm = Olesdr["编码"].ToString(); jw.Zm = Olesdr["字目"].ToString(); jw.Xh = Olesdr["序号"].ToString(); //jw.Bj = Olesdr[""].ToString(); jw.Jtz = Olesdr["简体字"].ToString(); jw.Ftz = Olesdr["繁体字"].ToString(); jw.Qtz = Olesdr["其它字"].ToString(); //jw.Bsbj = Olesdr[""].ToString(); jw.Bih = (int)Olesdr["筆劃"]; LisJw1.Add(jw); } data.Closeconn(); //zm strsql = "select * from bsbm where 序号 like'%000' order by 序号 asc"; Olesdr = data.Sqlread(strsql); while (Olesdr.Read()) { jw.Bm = Olesdr["编码"].ToString(); jw.Zm = Olesdr["字目"].ToString(); jw.Xh = Olesdr["序号"].ToString(); //jw.Bj = Olesdr[""].ToString(); jw.Jtz = Olesdr["简体字"].ToString(); jw.Ftz = Olesdr["繁体字"].ToString(); jw.Qtz = Olesdr["其它字"].ToString(); //jw.Bsbj = Olesdr[""].ToString(); if (Olesdr["筆劃"].ToString() == "") { jw.Bih = 50; } else { jw.Bih = (int)Olesdr["筆劃"]; } LisJw2.Add(jw); } data.Closeconn(); } 第二个发法 private void Lbl1Read() { flowLayoutPanel1.SuspendLayout(); label = new Label[LisJw1.Count]; for (int i = 0; i < LisJw1.Count; i++) { lb = label[i] = new Label(); label[i].Name = LisJw1[i].Bm; label[i].Text = LisJw1[i].Zm; //label[i].Tag = LisJw1[i].Bsbj;//tag标记中存储该部首是否是字 label[i].Tag = LisJw1[i].Bih; lb.Width = 2 * fontsize1; lb.Height = 2 * fontsize1 + 10; lb.Font = font1; lb.TextAlign = ContentAlignment.TopCenter; lb.TextAlign = ContentAlignment.MiddleCenter; flowLayoutPanel1.Controls.Add(label[i]); lb.Location = new Point(i * 2 * fontsize1 + 10, 10); lb.Paint += new PaintEventHandler(lb_paint); lb.MouseDown += new MouseEventHandler(lb_MouseDown); lb.ContextMenuStrip = BsContextMenustrip; } flowLayoutPanel1.ResumeLayout(); this.flowLayoutPanel1.AutoScrollMargin = new Size(5, 5); //this.AutoScrollMinSize = new Size(341, 423); this.flowLayoutPanel1.AutoSizeMode = AutoSizeMode.GrowAndShrink; this.flowLayoutPanel1.AutoScroll = true; } 第一个方法要访问数据库,第二个方法涉及到控件的事件。这些方法都是放在load事件里的,他们比较费时,我想给它们开一个线程,但总是出现各种错误,不开线程的时候就没有出错
youdiving 2013-04-25
  • 打赏
  • 举报
回复
程序还是出现了异常,我考虑用工作线程和一个ui线程吧
gomoku 2013-04-23
  • 打赏
  • 举报
回复

...
thread1 = new Thread(new ThreadStart(FrmLogin));
thread1.SetApartmentState(ApartmentState.STA);     //<--
thread1.Start();
不过最好的解决方法是,只用一个UI线程为主线程,把费时的加载放在工作线程下。

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧