读书人

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

发布时间: 2014-01-09 23:07:34 作者: rapoo

多线程中,有线程不执行的问题
问题:三个线程,其中第一个线程始终不执行程序.
代码如下:
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">指—ataGridView控件</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">指—ataGridView控件</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">指—ataGridView控件</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或者信号量等其他的方法控制线程同步更好一些吧

读书人网 >C#

热点推荐