gpt4 book ai didi

c# - 如何知道创建的线程数并相应地限制任务

转载 作者:行者123 更新时间:2023-12-03 13:19:52 24 4
gpt4 key购买 nike

很明显,使用 Taskasync/await而不是 Thread是进行异步调用的方法。我的问题是有没有办法监控完成这些任务时产生的线程?这样我就可以决定要调度的最佳任务数量,这样线程就不会一次占用大量 CPU 周期(假设任务是 CPU 密集型的)。

让我们在下面举一个例子(也提到了输出)。虽然程序在 5 秒内完成,但它创建了两个 线程 (Id=1,4) 完成所有任务。如果我将任务数增加到 6 个而不是 2 个,它会创建 4 线程 .我知道这些 CLR 线程映射到操作系统线程(在我的机器中总共有 4 个),但我想知道它们是如何被映射的(连同任务)和相应的 CPU 利用率。有没有办法做到这一点?

测试代码

    static void Main(string[] args)
{
RunTasksWithDelays().Wait();
}

static async Task RunTasksWithDelays()
{
Stopwatch s = Stopwatch.StartNew();

Console.WriteLine("ThreadId=" + Thread.CurrentThread.ManagedThreadId);
Task task1 = LongRunningTask1();
Task task2 = LongRunningTask2();

await Task.WhenAll(task1, task2);
Console.WriteLine("total seconds elapsed: " + s.ElapsedMilliseconds/1000);
}

static async Task LongRunningTask1()
{
Console.WriteLine("1 start " + DateTime.Now);
Console.WriteLine("ThreadId=" + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(5000);
Console.WriteLine("ThreadId=" + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("1 end " + DateTime.Now);
}

static async Task LongRunningTask2()
{
Console.WriteLine("2 start " + DateTime.Now);
Console.WriteLine("ThreadId=" + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(2000);
Console.WriteLine("ThreadId=" + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("2 end " + DateTime.Now);
}

输出
ThreadId=1
1 start 28-10-2014 18:27:03
ThreadId=1
2 start 28-10-2014 18:27:03
ThreadId=1
ThreadId=4
2 end 28-10-2014 18:27:05
ThreadId=4
1 end 28-10-2014 18:27:08
total seconds elapsed: 5
Press any key to continue . . .

最佳答案

using Task with async/await rather than Thread is the way to go for making asynchronous calls... (assuming the Tasks are CPU intensive).



异步(通常是 I/O 密集型)任务不是 CPU 密集型的。所以你不必担心。

如果您正在做 CPU 密集型工作,请查看 Parallel/Parallel LINQ 或 TPL 数据流,两者都有内置的限制选项。特别是 TPL Dataflow 非常适合混合 I/O 和 CPU 密集型代码。

关于c# - 如何知道创建的线程数并相应地限制任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26609534/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com