C# 计算Task.Run()创建的线程数
我正在对C# 计算Task.Run()创建的线程数,c#,multithreading,task,threadpool,C#,Multithreading,Task,Threadpool,我正在对BlockingCollection的性能进行基准测试 class Program { private static BlockingCollection<int> bc = new BlockingCollection<int>(100000); private static BlockingCollection<int> bc2 = new BlockingCollection<int>(100000); sta
BlockingCollection
的性能进行基准测试
class Program
{
private static BlockingCollection<int> bc = new BlockingCollection<int>(100000);
private static BlockingCollection<int> bc2 = new BlockingCollection<int>(100000);
static void Main(string[] args)
{
for (int i = 0; i < 100000; i++)
{
bc.TryAdd(i);
}
var stopWatch = new Stopwatch();
stopWatch.Start();
while (bc.Count != 0)
{
bc.Take();
}
stopWatch.Stop();
Console.WriteLine("Simple " + stopWatch.Elapsed.TotalMilliseconds);
createThreadPool(bc2);
Console.Read();
}
static void ByTaskRun(BlockingCollection<int> blockingCollection)
{
for (int i = 0; i < 100000; i++)
{
blockingCollection.TryAdd(i);
}
var stopWatch = new Stopwatch();
stopWatch.Start();
Task k = Task.Run(() =>
{
while (blockingCollection.Count != 0)
{
blockingCollection.Take();
}
});
stopWatch.Stop();
Console.WriteLine("Task.run " + stopWatch.Elapsed.TotalMilliseconds);
}
}
类程序
{
私有静态BlockingCollection bc=新BlockingCollection(100000);
私有静态BlockingCollection bc2=新BlockingCollection(100000);
静态void Main(字符串[]参数)
{
对于(int i=0;i<100000;i++)
{
bc.TryAdd(一);
}
var stopWatch=新秒表();
秒表。开始();
while(bc.Count!=0)
{
bc.Take();
}
秒表;
Console.WriteLine(“简单”+秒表。已用时间。总毫秒);
创建线程池(bc2);
Console.Read();
}
静态void ByTaskRun(BlockingCollection BlockingCollection)
{
对于(int i=0;i<100000;i++)
{
阻止收集。TryAdd(i);
}
var stopWatch=新秒表();
秒表。开始();
任务k=任务。运行(()=>
{
while(blockingCollection.Count!=0)
{
blockingCollection.Take();
}
});
秒表;
Console.WriteLine(“Task.run”+stopWatch.appeased.totalmillizes);
}
}
在
main()
方法中,我只是从阻塞集合中提取元素,而在ByTaskRun()
中,我运行一个任务来提取元素。我发现Task.Run()
是一个更快的方法。它是否在内部创建Threadpool
?如果我想获取由任务.Run
创建的线程数,如何获取该数?在此示例任务.Run()
中,仅使用一个线程。
您不会得到实际的工作持续时间。请查看.net线程池的大小,因为这是控制台应用程序中默认安排工作的位置。BlockingCollection在排队时是穷人的缓冲区。请看一看TPL数据流,以了解协调线程池(或任何地方)上的工作的正确异步方式。您还可以检查Process.Threads。我能做些什么来创建4个线程来从我的阻塞集合中删除那100000条记录呢。您正在使用
任务在后台启动任务。运行,然后立即停止秒表,而无需等待任务完成。见鬼,你甚至都没有等它启动——在你调用Console.WriteLine
时,它可能还没有得到它的第一片CPU时间。您输出的时间完全是垃圾。@joewite感谢您让我知道这一点。我不知道我得到了错误的运行时间,即任务仍在运行时。我认为您应该更加强调单词use(而不是create)。Task.Run仅在使用线程池的默认计划程序中对任务进行排队。在正常情况下,不会创建线程。如果线程池处于加载状态,它可能会创建更多线程。也许吧。如果我想通过创建多个线程来使用元素呢?我应该如何创建更多线程?如果你调用Task.Run在每个循环中,我可以做些什么来创建4个线程来从我的阻塞集合中删除那100000条记录?