我不敢相信我是第一个遇到这个问题的人(我也不想相信我是唯一一个太傻以至于不能直接看到解决方案的人),但我的搜索技能还不够强。
我经常遇到这样的情况:需要依次执行一些耗时的步骤。工作流程如下:
var data = DataGetter.GetData();
var processedData = DataProcessor.Process(data);
var userDecision = DialogService.AskUserAbout(processedData);
// ...
我不想在每个步骤中阻塞用户界面,因此每个方法都会立即返回,并在完成后触发一个事件。现在发生了一些有趣的事情,因为上面的代码块会发生变异。
DataGetter.Finished += (data) =>
{
DataProcessor.Finished += (processedData) =>
{
DialogService.Finished(userDecision) =>
{
// ....
}
DialogService.AskUserAbout(processedData);
}
DataProcessor.Process(data);
};
DataGetter.GetData();
对我来说,这读起来太像Continuation-passing style了,代码结构一定有更好的方式。但是该怎么做呢?
await
会使这个过程变得非常容易。所以,是的,人们经常遇到这个问题,这并不好看——足够严重,以至于它被纳入了核心语言。 - Roman Starkov