为什么这段代码会忽略await并继续进行?

时间:2014-02-14 23:46:12

标签: c# asynchronous

我有以下代码:

public Index () {
    InitializeIndexAsync();
}

async Task InitializeIndexAsync () {
    State = IndexState.Initializing;
    await Task.Factory.StartNew(async () => {
        // Initialize other things.

        await IndexAsync();
    });

    State = IndexState.Ready;
}

我希望在异步lambda完成之前不会遇到“State = IndexState.Ready”,但调试显示该行在完成上面的线程开始之前很久就被命中。这是为什么?

2 个答案:

答案 0 :(得分:4)

StartNew does not understand async lambdas,所以当你传递async lambda时,它会返回Task<Task>。从概念上讲,“外部”任务仅代表async lambda的 start ; “内部”任务代表async lambda的完成

这是reasons that StartNew is the wrong choice for async code中的一个,正如我在博客中解释的那样。更好的解决方案是使用Task.Run,其设计考虑到async

async Task InitializeIndexAsync () {
  State = IndexState.Initializing;
  await Task.Run(async () => {
    // Initialize other things.

    await IndexAsync();
  });

  State = IndexState.Ready;
}

答案 1 :(得分:0)

不确定所有这些等待你想要实现的目标...... 我会尝试通过一个初始化事物的同步方法来保持简单,然后另一个MethodAsync返回一个Task,我可以等待该任务:

    public async void Index()
    {
        await InitializeIndexAsync();
    }

    private Task InitializeIndexAsync()
    {
        return Task.Factory.StartNew(() => InitializeIndex());
    }

    private void InitializeIndex()
    {
        State = IndexState.Initializing;
        // Initialize other things synchronously.
        IndexAsync().Wait();

        State = IndexState.Ready;
    }

我希望这就是你的意思。