c# - “异步任务”与“返回 Task.Run”
问题描述
我是 async/await c# 模型的新手,并试图了解这两个选项是否本质上是同一件事:
public Task LongRunningMethod()
{
return Task.Run(async () =>
{
await DoStuff();
});
}
//then call it
await LongRunningMethod();
还有这个
public async Task LongRunningMethod()
{
await DoStuff();
}
//then call it
await LongRunningMethod();
我在想第一种方式会用完池中的一个额外线程......而且它还将一个任务包装成一个额外的任务。还是我错了?
解决方案
Task.Run
将其委托排队到线程池。这导致了两个重要的事情:
DoStuff
第一次异步之前的任何代码await
都将在线程池线程上运行,而不是在调用线程上。- 中的代码
DoStuff
将在线程池上下文中运行,而不是使用调用线程当前的任何上下文。
大多数时候,做异步工作Task.Run
是一个错误。但它有时很有用,例如,如果DoStuff
在异步操作之前进行一些繁重的计算工作,那么Task.Run
可以用来将该工作移出 UI 线程。
推荐阅读
- php - wordwrap() 文本并居中对齐 imagettftext()
- oracle - 在 Pro*C 中使用带有动态查询的`execute immediate bulk collect into`
- python - Python 在 Tkinter 中添加滚动条
- r - 过滤列中的值并删除不符合条件的行
- android - 您的 Google Playstore 订阅没有试用期是否仍会自动让用户订阅该订阅?
- r - 如何编写带有所需参数的 purrr 循环
- html - 问题:mat-form-field 保持在同一行
- python - Django startproject 的问题
- firebase - 当前登录的众多用户中,currentUser 将返回哪个用户?
- javascript - 我怎样才能完成对角线这些div的动画?