主要问题是:如何在后台的几个线程上运行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(),...
使用类似的结构感谢您的帮助。
答案 0 :(得分:2)
使用.NET 4.0任务而不是自己创建新的线程。任务为您提供更精细的控制粒度,使数据易于传递到后台操作,并为在多个并发任务中等待结果提供出色的支持,并在需要时一举取消所有内容。强烈推荐。
答案 1 :(得分:1)
如何在几个线程的TestingButton_Click中运行代码 背景
我会使用任务,因为他们的设计完全符合您的要求。
在接近实际解决方案之前,我将回答的唯一问题如下:
报告进度
有很多方法可以报告给定线程的进度,您必须订阅一个事件,并编写代码来报告线程的进度。为了更新表单上的控件,这需要您调用更改,这不是一个简单的功能。