年终公司开年会,节目上有个抽奖节目,公司要求用程序随机抽取中奖者,因为抽奖者众多,我用了多线程来进行开发,我的大概思路是这样的:主界面上有5列,每列有13个Label存放待抽奖者,每个线程控制一列,当按下开始按钮时,5个线程同时启动,每个线程通过如下方法为Label赋值:
if (Thread.CurrentThread.ManagedThreadId == t2.ManagedThreadId)
{ while (true)
{
int z = 0;
Random a = new Random();
for (int i = 14; i <= 2 * 13; i++)
{
z = a.Next(200, 400);
((Label)(panel2.Controls.Find("L" + i.ToString(), true)[0])).Text = GetStaff.arrStaff[z].ToString();
} Thread.Sleep(100);
}
}
这样一旦启动线程,Label上的名字就实现变换,当按下停止按钮的时候,线程终止,Label上的Text就是中奖者,但问题来了,在启动一个线程的时候,这个做法没问题,但在5个线程一起开的时候,运行时会报一个异常:集合在枚举数实例化后进行了修改.这句话什么意思??异常那句就是((Label)(panel2.Controls.Find("L" + i.ToString(), true)[0])).Text = GetStaff.arrStaff[z].ToString();
其中GetStaff类是用来读取员工名单的一个txt文件,类代码如下class GetStaff
{
public static string[] GetStaffInfo()
{
string[] staff = File.ReadAllLines(@"StaffSources.txt",Encoding.Default);
return staff;
} public static ArrayList arrStaff = new ArrayList(GetStaffInfo());
}
请问是什么原因导致异常?急求解决办法!谢谢
if (Thread.CurrentThread.ManagedThreadId == t2.ManagedThreadId)
{ while (true)
{
int z = 0;
Random a = new Random();
for (int i = 14; i <= 2 * 13; i++)
{
z = a.Next(200, 400);
((Label)(panel2.Controls.Find("L" + i.ToString(), true)[0])).Text = GetStaff.arrStaff[z].ToString();
} Thread.Sleep(100);
}
}
这样一旦启动线程,Label上的名字就实现变换,当按下停止按钮的时候,线程终止,Label上的Text就是中奖者,但问题来了,在启动一个线程的时候,这个做法没问题,但在5个线程一起开的时候,运行时会报一个异常:集合在枚举数实例化后进行了修改.这句话什么意思??异常那句就是((Label)(panel2.Controls.Find("L" + i.ToString(), true)[0])).Text = GetStaff.arrStaff[z].ToString();
其中GetStaff类是用来读取员工名单的一个txt文件,类代码如下class GetStaff
{
public static string[] GetStaffInfo()
{
string[] staff = File.ReadAllLines(@"StaffSources.txt",Encoding.Default);
return staff;
} public static ArrayList arrStaff = new ArrayList(GetStaffInfo());
}
请问是什么原因导致异常?急求解决办法!谢谢
解决方案 »
- 如何设置.NET开发的Activex插件的theme
- 实在不会了,求高手进来帮忙
- DatagridView 小数点位数控制?
- 15分钟结贴哦..只要解答对我有用的,都有分。刚接触javascript,高手帮下我。。谢谢
- 求高手:动态添加DataGridView的问题
- image 和byte[]问题
- TreeView+DataGrid 求助
- 如果要在WinForm中调用ASP.NET Web应用程序中一个页面怎么办啊!!!
- C#引用LumiSoft.Net.dll搜索邮件,报错“00003 BAD Missing or invalid argument to SEARCH”如何解决
- c#中访问数据库,主要是access,ms sql server,用什么最好?请给个用ado.net访问数据库,并显示数据库的例子。
- 留言板,特殊字符!【急】
- dataGridView1最后一行合计不排序
foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用。
少用panel2.Controls.Find的方法,自己记录下来,例如
Label[] lbs = new Label[]{Label1,Label2 等};
使用这个lbs数组。
this.Invoke((EventHandler)delegate
{
((Label)(panel2.Controls.Find("L" + i.ToString(), true)[0])).Text = GetStaff.arrStaff[z].ToString();
});
12 楼用 this.Invoke 正是把具体的处理又丢回 UI 线程了
所有对控件的操作最终都要在 UI 线程上完成,你用了多线程,就不得不测试 InvokeRequired 属性,然后使用 Invoke 来执行委托。动画效果本来就不是 winform 的长处。试试 DoubleBuffered。
{
//操作界面
});
也可使用BackGroundWorker
ThreadPool.QueueUserWorkItem