在后台运行并行

时间:2011-12-14 16:59:27

标签: c# wpf background parallel-processing

主要问题是:如何在后台的几个线程上运行TestingButton_Click中的代码(类似于BackgroundWorker),这样我就可以:
1.获取所有原始数据到方法
2.同时取消所有线程的测试
3.报告进度
4.将所有结果表检索到主线程。

以下代码位于TestingButton_Click

List<Thread> threads = new List<Thread>();

            //Testing for each pair
            foreach (InterfaceWithClassName aCompound in Group1)
            {
                foreach (InterfaceWithClassName bCompound in Group2)
                {
                    InstancePair pair = new InstancePair();
                    //some code

                    if (testModeParallel)
                    {
                        Thread thr = new Thread(TestPairParallel);
                        thr.Start(pair);
                        threads.Add(thr);
                    }

                    else
                    {
                        Thread thr = new Thread(TestPairSerial);
                        thr.Start(pair);
                        threads.Add(thr);
                    }
                }
            }              

            while (true)
            {
                int i = 0;

                foreach (Thread thread in threads)
                {
                    if (thread.IsAlive)
                        break;

                    i++;
                }

                if (i == threads.Count)
                    break;

                Thread.Sleep(1000);
            }
            pairsResultsDataGrid.ItemsSource = tab.DefaultView

用户可以选择要测试的化合物,因此每次测试时都有不同的对数。 为了以防万一,我使用了不同的方法TestPairSerial()和TestPairParallel()。

TestPairSerial()结构是

        do
        {
            do
            {

            } while (isSetbCompaundParams);

        } while (isSetaCompaundParams);

        //filling up results into tables (main window variables) later to be connected to DataGrids

TestPairParallel()使用InfinitePartitioner实现,并且仅使用Parallel.ForEach(new InfinitePartitioner(),...

使用类似的结构

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

使用.NET 4.0任务而不是自己创建新的线程。任务为您提供更精细的控制粒度,使数据易于传递到后台操作,并为在多个并发任务中等待结果提供出色的支持,并在需要时一举取消所有内容。强烈推荐。

答案 1 :(得分:1)

  

如何在几个线程的TestingButton_Click中运行代码   背景

我会使用任务,因为他们的设计完全符合您的要求。

在接近实际解决方案之前,我将回答的唯一问题如下:

  

报告进度

有很多方法可以报告给定线程的进度,您必须订阅一个事件,并编写代码来报告线程的进度。为了更新表单上的控件,这需要您调用更改,这不是一个简单的功能。