如何调用异步方法

How to call async methods

假设有一个方法

async static System.Threading.Tasks.Task Do()
{
    //do sth
    await Task.Delay(10000);
}

现在,当我用

调用方法时
Do();

它会创建一个新线程吗?或者我必须创建一个线程如下

Task.Factory.StartNew(() => Do());

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

我所有的案例都是这样的:

 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() 并使用五个具有不同间隔的不同操作。 这样使用正确吗?