假设我有以下代码(仅供学习目的):
static async Task Main(string[] args)
{
var results = new ConcurrentDictionary<string, int>();
var tasks = Enumerable.Range(0, 100).Select(async index =>
{
var res = await DoAsyncJob(index);
results.TryAdd(index.ToString(), res);
});
await Task.WhenAll(tasks);
Console.WriteLine($"Items in dictionary {results.Count}");
}
static async Task<int> DoAsyncJob(int i)
{
// simulate some I/O bound operation
await Task.Delay(100);
return i * 10;
}
我想知道如果我按照以下方式进行操作,会有什么不同:
var tasks = Enumerable.Range(0, 100)
.Select(index => Task.Run(async () =>
{
var res = await DoAsyncJob(index);
results.TryAdd(index.ToString(), res);
}));
我在两种情况下获得了相同的结果,但代码执行方式是否相似呢?
Task.Run
调度线程池上的工作。这意味着您正在将工作推送到线程池线程,但它们会立即返回,因为它们唯一的工作是启动DoAsyncJob
。在这里使用Task.Run
是无用的。只有当您将 IO 绑定的工作替换为 CPU 绑定的工作时,才需要使用Task.Run
。 - FCin