Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算Task.Run()创建的线程数_C#_Multithreading_Task_Threadpool - Fatal编程技术网

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条记录?