C# 在后台并行运行

C# 在后台并行运行,c#,wpf,background,parallel-processing,C#,Wpf,Background,Parallel Processing,主要问题是:如何在TestingButton中运行代码\u在后台单击几个线程(类似于BackgroundWorker),这样我就可以: 1.将所有原始数据获取到方法中 2.同时取消所有线程的测试 3.报告进度 4.将所有结果表检索到主线程 下面的代码在TestingButton\u Click中 List<Thread> threads = new List<Thread>(); //Testing for each pair

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

下面的代码在TestingButton\u 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
TestPairParallel()是使用InfinitePartitioner实现的,并且仅使用与Parallel.ForEach类似的结构(新的InfinitePartitioner()


感谢您的帮助。

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

使用.NET 4.0任务,而不是自己创建新线程。任务为您提供了更精细的控制粒度,便于将数据传递到后台操作,并为跨多个并发任务等待结果以及在需要时一次性取消所有任务提供了出色的支持。高度r推荐

如何在TestingButton_中运行代码单击中的几个线程 背景

我会使用任务,因为它们被设计为完全满足您的需求

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

报告进展

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

如何在TestingButton_中运行代码单击中的几个线程 背景

我会使用任务,因为它们被设计为完全满足您的需求

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

报告进展


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

您的问题是什么。您的第一句话毫无意义。提出一个问题。我建议你丢掉背景信息,因为它与你当前的问题无关。看一看课堂。请选择一个问题提问,只发布与该问题相关的信息。已编辑,但有4个问题,因为它们是相关的。@Vitaly-让我们来处理一个问题评估。没有理由这不能是4个独立的问题,让我们一次解决一个,对我们来说容易得多,这将允许您理解我们的答案(而不是简单地向您提供您不理解的工作代码)。你的问题到底是什么。你的第一句话毫无意义。提出一个问题。我建议你丢掉背景信息,因为它与你当前的问题无关。看一看课堂。请选择一个问题提问,只发布与该问题相关的信息。已编辑,但共有4个问题评估,因为它们是相关的。@Vitaly-让我们来处理一个问题。没有理由这不能是4个独立的问题,让我们一次解决一个问题,这会让我们更容易理解我们的答案(而不是简单地向您提供您不懂的工作代码)。他们提供进度报告吗?(像BackgroundWorker)。@Vitaly-他们可以…如果你编写代码的话。BackgroundWorker没有什么特别的地方,它只有你可以订阅的事件。你仍然需要编写代码,使用调用更新一些控件。他们提供进度报告吗?(像BackgroundWorker)@Vitaly-他们可以…如果你编写代码的话。BackgroundWorker没有什么特别之处,它只有你可以订阅的事件。你仍然需要编写代码,更新一些控件,使用调用。谢谢。我最好先研究TPL,然后再问任何问题。似乎你们每个人都在向我指出这个方向。谢谢你欧。我最好先研究一下第三方物流,然后再问更多的问题。看来你们每个人都在向我指出这个方向。
        do
        {
            do
            {

            } while (isSetbCompaundParams);

        } while (isSetaCompaundParams);

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