【发布时间】:2022-01-12 21:18:20
【问题描述】:
我有这段代码(同步方式):
// ...
var processingTasks = Enumerable.Range(0, count)
.Select(x => Task.Run(async () =>
await CallApiAndUpdateSthAsync(accounts[x], cancellationToken)))
.ToList();
var processingTasksAggregate = Task.WhenAll(processingTasks);
Task.WaitAny(globalStatusMonitoringTask, processingTasksAggregate);
我对这部分特别感兴趣:
Task.Run(async () => await CallApiAndUpdateSthAsync(accounts[x], cancellationToken))
如果我删除了Task.Run,它会有所不同吗(从可能的死锁角度来看)? IE。改为:
CallApiAndUpdateSthAsync(accounts[x], cancellationToken)
我想删除它,因为在线程池中排队任务(通过Task.Run)似乎是多余的,但我的同事建议我不要这样做,因为可能会出现死锁
整个方法作为后台作业运行,类似于 Hangfire:
[编辑 1]:这是一个 .NET Framework(不是核心)应用程序。
【问题讨论】:
-
如果不知道
CallApiAndUpdateSthAsync()的内容,就很难回答这个问题。但是,是的,它可以有所作为。 -
“切换到不同的线程池(通过Task.Run)”这是什么意思?
-
我的意思是
queueing the task on a thread pool- 我更新了问题。 (docs.microsoft.com/en-us/dotnet/api/…) -
@JohnWu 我们不能黑箱
CallApiAndUpdateSthAsync吗? IE。从那里调用了各种方法,很难具体说明正在发生的所有事情。这是一个在少数外部服务(API / Db)上调用等待的异步方法
标签: .net asynchronous task wait