C# 多线程数据混乱的问题 10
刚刚学多线程,连入门都没有。以下代码和效果图。求大虾们解答一下为什么会数据混乱?t[0]=newThread(delegate(){Text_Run("你好1","多线程...
刚刚学多线程,连入门都没有。以下代码和效果图。求大虾们解答一下为什么会数据混乱?
t[0] = new Thread(delegate(){
Text_Run("你好1", "多线程");
});
t[1] = new Thread(delegate()
{
Text_Run("你好2", "多线程");
});
t[2] = new Thread(delegate()
{
Text_Run("你好3", "多线程");
});
t[3] = new Thread(delegate()
{
Text_Run("你好4", "多线程");
});
t[4] = new Thread(delegate()
{
Text_Run("你好5", "多线程");
});
t[0].Start();
t[1].Start();
t[2].Start();
t[3].Start();
t[4].Start();
private void Text_Run(object test1,object test2)
{
textBox1.AppendText(test1.ToString() +"|"+ test2.ToString()+"\r\n");
}
输出文本框的图——(即没有顺序,也没有标准。怎么回事?)
你你好4|多线程
你好5|多线程
你好2|多线程
好3|多线程
你好1|多线程 展开
t[0] = new Thread(delegate(){
Text_Run("你好1", "多线程");
});
t[1] = new Thread(delegate()
{
Text_Run("你好2", "多线程");
});
t[2] = new Thread(delegate()
{
Text_Run("你好3", "多线程");
});
t[3] = new Thread(delegate()
{
Text_Run("你好4", "多线程");
});
t[4] = new Thread(delegate()
{
Text_Run("你好5", "多线程");
});
t[0].Start();
t[1].Start();
t[2].Start();
t[3].Start();
t[4].Start();
private void Text_Run(object test1,object test2)
{
textBox1.AppendText(test1.ToString() +"|"+ test2.ToString()+"\r\n");
}
输出文本框的图——(即没有顺序,也没有标准。怎么回事?)
你你好4|多线程
你好5|多线程
你好2|多线程
好3|多线程
你好1|多线程 展开
1个回答
展开全部
多线程操作中,各个线程如果是同时运行的话,他们的执行先后顺序是不确定的,多线程就这样,即使它偶然出现了跟你预期的顺序一样,那也只是巧合罢了
而且你多线程里有都是用了textBox1这个资源,他们会抢用,按理说你应该在各个线程中先把这个资源锁住,用完了以后再释放
而且你多线程里有都是用了textBox1这个资源,他们会抢用,按理说你应该在各个线程中先把这个资源锁住,用完了以后再释放
追问
原来如此,那我应该怎么修改才可以让他们顺序,并接近同时的在TextBox中输出结果呢?
我刚刚加了给lock和textBox1.InvokeRequired的判断,貌似不抢资源了、但输出的顺序还是乱的。还应该怎么修改?其实忽略顺序的问题,如果线程要等待资源释放才进行工作,那么和单线程有什么区别?我原意是希望能搭建140个线程同一时间运行一个方法的。大侠求解释啊
追答
”按顺序执行“ 本来就不是多线程的目的,如果真的需要按顺序的话,直接用单线程就可以了
多线程操作是为了实现多任务同时运行的,比如一遍听音乐一遍写word文档,这两个事情就是两个线程(实际上是两个进程,每个进程包含多个线程,这里只是比喻一下),这两个事情没有先后顺序,也不可以先等待一个完成以后再进行另一个,多线程操作就是为了实现这个的
你大贱140个线程同时运行一个方法,你要注意,这个"同时”并不是真正的同时,他们的执行顺序由操作系统去调度,也是有先后顺序的,真正要“同时”的那个叫做“并行处理”
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询