我正在写一个压力测试实用程序。在这个实用程序中,我希望我连续地加载10个线程(10,000个线程中)。下面是我的代码
Stopwatch watch = new Stopwatch();
watch.Start();
int itemProcessed = 0;
do
{
List<Task> taskList = new List<Task>();
for (int i = 0; i < _parallelThreadCount; i++)
{
taskList.Add(Task.Factory.StartNew(() => _taskDelegate()));
itemProcessed++;
}
Task.WaitAll(taskList.ToArray());
} while (itemProcessed < _batchSize);
watch.Stop();
现在的问题是,我使用了Task.WaitAll,因此初始负载是10个线程,然后是9、8、7、6、5、4、3、2、1、0。然后我又添加了10个线程。
谁能给予我一个主意,如何实现这一点。
3条答案
按热度按时间ctehm74n1#
Shaaman的答案很好,可能是你想在你的特定场景中使用的答案。我只是提出了一些你可以使用的其他可能的选择,这些选择可能更适用于其他场景。
My blog post展示了如何使用Tasks和Actions来实现这一点,并提供了一个示例项目,您可以下载并运行该项目来查看两者的运行情况。
采取行动
如果使用Actions,你可以使用内置的.Net Parallel.invoke函数。这里我们限制它最多并行运行10个线程。
有任务
Tasks没有内置函数,但是你可以使用我在博客上提供的函数。
然后创建任务列表并调用函数来运行它们,比如说一次最多同时运行10个任务,您可以这样做:
cu6pst1q2#
如果您可以稍微调整一下代码结构(阅读:替换您的
do while
循环),您可以使用Parallel
class。您可能最感兴趣的是
ParallelOptions
的MaxDegreeOfParallelism
属性-它指定可以同时运行多少个线程。编辑:
由于您没有任务列表,而只是想多次重复相同的操作,因此可以使用
Parallel.For
。请注意,如果使用
itemProcessed
的唯一原因是检查循环要工作多长时间,则可以安全地从上面的代码中删除这两行代码。ego6inou3#
这个解决方案松散地基于@deadlydog answer,但是适用于那些你想要运行async/await函数的情况,执行的顺序不一定(这不是一个队列),但是所有的任务都应该运行。