想象一下有一种方法
async static System.Threading.Tasks.Task Do()
{
//do sth
await Task.Delay(10000);
}
现在,当我用
调用方法时Do();
它是否会成为一个新线程?或者我必须创建一个如下所示的线程
Task.Factory.StartNew(() => Do());
答案 0 :(得分:3)
Do
没有创建帖子。
await之前的部分在调用线程上运行,并且在延迟期间根本没有线程。 Task.Delay
在内部使用一个计时器,在整个操作过程中不会占用一个线程。
当延迟完成时,ThreadPool中的一个线程用于继续执行该方法。
关于Task.Factory.StartNew
,您为什么要创建一个帖子?如果你需要将CPU密集型方法卸载到线程池中,那么它很好(尽管Task.Run
更好)但是如果你不这样做,那么只需调用Do
并等待结果:
await Do();
如果您坚持为Do
创建新主题,则需要使用TaskCreationOptions.LongRunning
:
Task.Factory.StartNew(() => Do(), TaskCreationOptions.LongRunning);
但是,由于Do
是一个异步方法,当它到达第一个等待时就会释放该线程,但这并没有任何意义,正如我在我的博客上所解释的那样:LongRunning Is Useless For Task.Run With async-await < / p>
答案 1 :(得分:-1)
我的所有情况都是这样的:
public void Start(Action action)
{
Token = CancellationToken.None;
IsRunning = true;
Task.Factory.StartNew(() => Do(action), TaskCreationOptions.LongRunning);
}
async Task Do(Action action)
{
while (IsRunning)
{
action();
await Task.Delay(Interval, Token);
}
}
然后我用不同的间隔调用五个不同的动作来调用Start()。 这是正确的吗?