如何调用异步方法

时间:2015-10-25 12:51:02

标签: c# .net multithreading async-await task-parallel-library

想象一下有一种方法

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

现在,当我用

调用方法时
Do();

它是否会成为一个新线程?或者我必须创建一个如下所示的线程

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

2 个答案:

答案 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()。 这是正确的吗?