日期:2014-05-17  浏览次数:20903 次

循环内加入线程的问题
C# code

            foreach (DataRow dr in dt.Rows)
            {
                try
                {
                    t = new Thread(doThis);
                    object val = dr["Domain"].ToString(); 
                    t.IsBackground = true;
                    t.Start(val);

                }
                catch
                {
                    rank.Doing = false;
                    MessageBox.Show("发生错误,请联系管理员");
                }
            }


如上代码所示,循环内加入线程执行doThis方法。因为doThis方法所做操作耗时较长且不一定,dothis还未执行完成程序就开始下一次循环了,导致程序混乱。如何才能做到保证doThis方法执行完成后再开始下一次循环

------解决方案--------------------
做个标识呗,每次循环先判断标志,做好锁就可以了。
------解决方案--------------------
晕倒,多线程的目的本来就是并发,让多个任务同时进行,如果你要执行完一次doThis后再执行下一次,那么何必用线程?直接调用dothis就完了,

这样:

foreach (DataRow dr in dt.Rows)
{
object val = dr["Domain"].ToString(); 
doThis(val);
}

绝对是执行完dothis后再进行下一次循环,

------解决方案--------------------
如果你非要用多线程来实行非并发操作,可以用Thread.Join方法,Thread.Join会一直等待,直到线程结束才返回,


foreach (DataRow dr in dt.Rows)
{
try
{
t = new Thread(doThis);
object val = dr["Domain"].ToString(); 
t.IsBackground = true;
t.Start(val);
t.Join();

}
catch
{
rank.Doing = false;
MessageBox.Show("发生错误,请联系管理员");
}
}
不过这样的程序确实很难看,

------解决方案--------------------
你想用线程做什么?不是异步处理?如果同步不需要把处理放到线程中去