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

lored29 2014-01-08 10:34:37
问题:三个线程,其中第一个线程始终不执行程序.
代码如下:
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();
}
}
}

执行结果:只有第二张和第三张表执行了删除列的操作,而第一张表根据未执行.
请问为什么多谢!
...全文
790 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wayu002 2014-01-08
  • 打赏
  • 举报
回复
引用
while (!balance.IsAlive&&!income.IsAlive&&!cash.IsAlive) { Thread.Sleep(10); }
这个while语句是不是有问题?如果任何一个线程处于活动状态,那么直接实行下一句
引用
balance.Abort();
,即使第一个balance删除操作还没有进行完毕,线程被终止了,应该用event或者信号量等其他的方法控制线程同步更好一些吧
lele_nancy 2014-01-08
  • 打赏
  • 举报
回复
引用 2 楼 lored29 的回复:
[quote=引用 1 楼 lele_nancy 的回复:] Debug结果怎么样 ,那个线程不跑吗? 或者就启动第一个看看把。
---------------------------------------------- Debug显示只到 if (dgvBalance.InvokeRequired)程序自动跳转开,不执行以后的语句.[/quote] 说明线程没有问题了。 dgvBalance空间一直被占用,所以到不了for里面吧。 private delegate void del(); 写三个看看
lored29 2014-01-08
  • 打赏
  • 举报
回复
引用 4 楼 vb763305825 的回复:
Thread balance = new Thread(new ThreadStart deleteDataColumnsOfBalance));
少了个括号难道不报错?
Thread balance = new Thread(new ThreadStart(deleteDataColumnsOfBalance));
----------------------------------------------------------------------- 程序里没错误,粘贴时出错了.
  • 打赏
  • 举报
回复
Thread balance = new Thread(new ThreadStart deleteDataColumnsOfBalance));
少了个括号难道不报错?
Thread balance = new Thread(new ThreadStart(deleteDataColumnsOfBalance));
lored29 2014-01-08
  • 打赏
  • 举报
回复
引用 1 楼 lele_nancy 的回复:
Debug结果怎么样 ,那个线程不跑吗? 或者就启动第一个看看把。
---------------------------------------------- Debug显示只到 if (dgvBalance.InvokeRequired)程序自动跳转开,不执行以后的语句.
lele_nancy 2014-01-08
  • 打赏
  • 举报
回复
Debug结果怎么样 ,那个线程不跑吗? 或者就启动第一个看看把。

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧