怎么判断子线程是否执行完毕.

江南野鹤 2012-05-07 11:18:24
在程序中,我开启了10个线程,我想在规定时间后去检查 还剩余几个线程未执行.

怎么做?
上代码,哈哈,谢谢了
...全文
999 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
江南野鹤 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]
1。用线程的Join方法
2.不用线程,用BackgroundWorker并注册WorkComplete事件
[/Quote]

,上段代码 看看
江南野鹤 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]
是Task还是Thread?
通过Thread.IsAlive可以知道线程是否在执行,不过是完成还是被中止就不一定了,相比之下Thread.ThreadState可以提供更多的信息。

Task则可以用IsCompleted获得是否完成
[/Quote]

是Thread,上段代码 看看
兔子-顾问 2012-05-10
  • 打赏
  • 举报
回复
1。用线程的Join方法
2.不用线程,用BackgroundWorker并注册WorkComplete事件
Bullatus 2012-05-10
  • 打赏
  • 举报
回复
是Task还是Thread?
通过Thread.IsAlive可以知道线程是否在执行,不过是完成还是被中止就不一定了,相比之下Thread.ThreadState可以提供更多的信息。

Task则可以用IsCompleted获得是否完成
江南野鹤 2012-05-10
  • 打赏
  • 举报
回复
上段代码 看看
  • 打赏
  • 举报
回复
WaitForSingleObject(hThread,INFINITE);
NewUser2008 2012-05-07
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Data.SqlClient;
using System.Data;

namespace ConApp
{
class Program
{
static void Main(string[] args)
{
for (int index = TASKCOUNT; --index >= 0; )
{
ThreadPool.QueueUserWorkItem(Run,index);

Thread.Sleep(new Random(Guid.NewGuid().GetHashCode()).Next(100, 500));
}


wait.WaitOne();

Console.WriteLine("任意键结束....");
Console.ReadKey();

}

static ManualResetEvent wait = new ManualResetEvent(false);

static int TASKCOUNT = 100;

static void Run(object obj)
{

Thread.CurrentThread.Name = obj.ToString();

Thread.Sleep(new Random(Guid.NewGuid().GetHashCode()).Next(4000, 5000));


if (Interlocked.Decrement(ref TASKCOUNT) == 0)
{
wait.Set();
}
else
{
Console.WriteLine("完成{0}", obj);
}
}
}
}

江南野鹤 2012-05-07
  • 打赏
  • 举报
回复
答非所问啊
NewUser2008 2012-05-07
  • 打赏
  • 举报
回复
定义一个变量,

int TASKCOUNT = 10;


//线程结束
Interlocked.Decrement(ref TASKCOUNT) ;


Rotaxe 2012-05-07
  • 打赏
  • 举报
回复
Thread.ThreadState
mizuho_2006 2012-05-07
  • 打赏
  • 举报
回复
四、使用IAsyncResult asyncResult属性来判断异步调用是否完成

虽然上面的方法可以很好地实现异步调用,但是当调用EndInvoke方法获得调用结果时,整个程序就象死了一样,这样做用户的感觉并不会太好,因此,我们可以使用asyncResult来判断异步调用是否完成,并显示一些提示信息。这样做可以增加用户体验。代码如下:

static void Main(string[] args)
{ NewTaskDelegate task = newTask;
IAsyncResult asyncResult = task.BeginInvoke(2000, null, null);
while (!asyncResult.IsCompleted)
{
Console.Write("*");
Thread.Sleep(100);
} // 由于异步调用已经完成,因此, EndInvoke会立刻返回结果
int result = task.EndInvoke(asyncResult);
Console.WriteLine(result); }
  • 打赏
  • 举报
回复
Thread.IsAlive
返回true,表示线程还在执行,false已经完成
zscayz3 2012-05-07
  • 打赏
  • 举报
回复
建议使用Task<T>代替,有比较方便的线程结果,完成情况等等。。。
NewUser2008 2012-05-07
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Data.SqlClient;
using System.Data;

namespace ConApp
{
class Program
{
static void Main(string[] args)
{
for (int index = TASKCOUNT; --index >= 0; )
{
ThreadPool.QueueUserWorkItem(Run, index);

Thread.Sleep(new Random(Guid.NewGuid().GetHashCode()).Next(100, 500));
}


wait.WaitOne();

Console.WriteLine("任意键结束....");
Console.ReadKey();

}

static ManualResetEvent wait = new ManualResetEvent(false);

static int TASKCOUNT = 100;

static void Run(object obj)
{

Thread.CurrentThread.Name = obj.ToString();

Thread.Sleep(new Random(Guid.NewGuid().GetHashCode()).Next(4000, 5000));


if (Interlocked.Decrement(ref TASKCOUNT) == 0)
{
wait.Set();
}
else
{
Console.WriteLine("还有{0}个未完成", TASKCOUNT);
}
}
}
}



江南野鹤 2012-05-07
  • 打赏
  • 举报
回复
递曾 呵呵
江南野鹤 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
多线程不一定保证按顺序的吧
[/Quote]

这个我当然知道,可是已经完成的子线程的数量 应该是递减的吧
江南野鹤 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
TASKCOUNT 才是没完成的个数
[/Quote]

我换成TASKCOUNT了,执行了一下.还是不对啊.
macooidle 2012-05-07
  • 打赏
  • 举报
回复
多线程不一定保证按顺序的吧
NewUser2008 2012-05-07
  • 打赏
  • 举报
回复
TASKCOUNT 才是没完成的个数
NewUser2008 2012-05-07
  • 打赏
  • 举报
回复
Console.WriteLine("完成{0}", TASKCOUNT);
加载更多回复(1)

111,098

社区成员

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

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

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