所有线程完成工作后获取通知

时间:2014-11-12 06:47:44

标签: c# wpf multithreading

我是线程概念的新手,在我的应用程序中第一次使用线程。我的一个应用程序处理多个数据,没有线程它需要大约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
         {
            //
         } 
     }

上面的示例代码完全正常工作,除了通知部分,我想在所有线程完成后台工作时通知。剩下最后一步,总结了所有这些线程完成的工作。

请帮忙

2 个答案:

答案 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");

基本上,跟踪线程并立即检查它们的状态,不会阻塞主线程。