首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

多线程中,有线程不执行的有关问题

2014-01-09 
多线程中,有线程不执行的问题问题:三个线程,其中第一个线程始终不执行程序.代码如下:private delegate voi

多线程中,有线程不执行的问题
问题:三个线程,其中第一个线程始终不执行程序.
代码如下:
        private delegate void del();

        private void clearControls()
        {
            
            Thread balance = new Thread(new ThreadStart deleteDataColumnsOfBalance));
            balance.Start();
            Thread income = new Thread(new ThreadStart(deleteDataColumnsOfIncome));
            income.Start();
            Thread cash = new Thread(new ThreadStart(deleteDataColumnsOfCash));
            cash.Start();


            while (!balance.IsAlive&&!income.IsAlive&&!cash.IsAlive) { Thread.Sleep(10); }
            balance.Abort();
            balance.Join();
            income.Abort();
            income.Join();
            cash.Abort();
            cash.Join();
        }

        /// <summary>
        /// 自定义方法:删除DataGridView控件列
        /// </summary>
        /// <param name="dgv">指定DataGridView控件</param>
        private void deleteDataColumnsOfBalance()
        {
            if (dgvBalance.InvokeRequired)
            {
                del d = new del(deleteDataColumnsOfBalance);
                dgvBalance.Invoke(d);
            }
            else
            {
                for (int i = dgvBalance.Columns.Count - 1; i > 1; i--)
                {
                    dgvBalance.Columns.Remove(dgvBalance.Columns[i]);
                    pgbar.PerformStep();
                }
            }
        }

        /// <summary>
        /// 自定义方法:删除DataGridView控件列
        /// </summary>
        /// <param name="dgv">指定DataGridView控件</param>
        private void deleteDataColumnsOfIncome()
        {
            if (dgvIncome.InvokeRequired)
            {
                del d = new del(deleteDataColumnsOfIncome);
                dgvIncome.Invoke(d);
            }
            else
            {
                for (int i = dgvIncome.Columns.Count - 1; i > 1; i--)
                {
                    dgvIncome.Columns.Remove(dgvIncome.Columns[i]);
                    pgbar.PerformStep();
                }


            }
        }

        /// <summary>
        /// 自定义方法:删除DataGridView控件列
        /// </summary>
        /// <param name="dgv">指定DataGridView控件</param>
        private void deleteDataColumnsOfCash()
        {
            if (dgvCash.InvokeRequired)
            {
                del d = new del(deleteDataColumnsOfCash);
                dgvCash.Invoke(d);
            }
            else
            {
                for (int i = dgvCash.Columns.Count - 1; i > 1; i--)
                {
                    dgvCash.Columns.Remove(dgvCash.Columns[i]);
                    pgbar.PerformStep();
                }
            }
        }

执行结果:只有第二张和第三张表执行了删除列的操作,而第一张表根据未执行.
请问为什么多谢!
[解决办法]

引用:
Quote: 引用:

Debug结果怎么样 ,那个线程不跑吗?
或者就启动第一个看看把。


----------------------------------------------
Debug显示只到
 if (dgvBalance.InvokeRequired)程序自动跳转开,不执行以后的语句.


说明线程没有问题了。
dgvBalance空间一直被占用,所以到不了for里面吧。
 private delegate void del();
 写三个看看
[解决办法]
引用
while (!balance.IsAlive&&!income.IsAlive&&!cash.IsAlive) { Thread.Sleep(10); }

这个while语句是不是有问题?如果任何一个线程处于活动状态,那么直接实行下一句
引用
balance.Abort();
,即使第一个balance删除操作还没有进行完毕,线程被终止了,应该用event或者信号量等其他的方法控制线程同步更好一些吧

热点排行