我是线程概念的新手,在我的应用程序中第一次使用线程。我的一个应用程序处理多个数据,没有线程它需要大约2分钟,而在线程的帮助它只需要25秒,但我希望通知所有线程完成工作。
private int z = 0 ;
startfunction()
{
z= 250;
start1step(z);
}
private void start1step(int i)
{
if (i < 0)
return;
else
{
Thread thread = new Thread(new ThreadStart(WorkThreadFunction));
thread.Start();
start1step( --i);
}
}
public void WorkThreadFunction( )
{
try
{
int x = z ;
z-- ;
// do some background work
if(x ==0)
MessageBox.Show("All Thread finished");
}
catch
{
//
}
}
上面的示例代码完全正常工作,除了通知部分,我想在所有线程完成后台工作时通知。剩下最后一步,总结了所有这些线程完成的工作。
请帮忙
答案 0 :(得分:4)
有很多方法可以做到这一点。我想说两种最方便的方法仍然与你当前的实现类似,包括使用CountDownEvent
或切换到Task
类进行线程化。第三种方法涉及使用Parallel.ForEach()
方法,这可能更适合您的特定方案。
CountDownEvent
看起来像这样:
CountDownEvent countDown = new CountDownEvent(250);
startfunction()
{
countDown.Reset();
start1step(250);
countDown.Wait();
}
private void start1step(int i)
{
while (i-- > 0)
{
new Thread(WorkThreadFunction, i).Start();
}
}
public void WorkThreadFunction(object o)
{
int x = (int)o;
try
{
// do some background work
}
catch
{
//
}
finally
{
countDown.Signal();
}
}
Task
看起来像这样:
startfunction()
{
Task[] tasks = new Task[250];
start1step(tasks);
Task.WaitAll(tasks);
}
private void start1step(Task[] tasks)
{
for (int i = 0; i < tasks.Length; i++)
{
int taskParam = i;
tasks[i] = Task.Run(() => WorkThreadFunction(taskParam));
}
}
public void WorkThreadFunction(int x)
{
try
{
// do some background work
}
catch
{
//
}
}
Parallel.ForEach()
看起来像这样:
startfunction()
{
Parallel.ForEach(Enumerable.Range(0, 250), i => WorkThreadFunction(i));
}
public void WorkThreadFunction(int x)
{
try
{
// do some background work
}
catch
{
//
}
}
答案 1 :(得分:-2)
在你的主线程中你可以做这样的事情......
List<Thread> threads = new List<Thread>();
// CREATE THREADS and add them to the list of threads
while (threads.Any(x => x.IsAlive))
{
Thread.Sleep(500);
}
Console.WriteLine("done");
基本上,跟踪线程并立即检查它们的状态,不会阻塞主线程。