我有以下代码:
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”,但调试显示该行在完成上面的线程开始之前很久就被命中。这是为什么?
答案 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;
}
我希望这就是你的意思。