我需要修改现有程序,它包含以下代码:
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
但这对我来说似乎很奇怪,首先是在select中使用async
和await
。根据Stephen Cleary的回答,我应该可以删除那些内容。
然后第二个Select
选择结果。这不是说任务根本不异步,而是同步执行(付出了很多努力却没有做),还是会异步执行任务,完成后是否执行其余查询?
我是否应该根据Stephen Cleary的另一个答案,像下面那样编写上面的代码:
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
这样完全一样吗?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
当我从事这个项目时,我想更改第一个代码示例,但是我不太想更改(似乎在工作)异步代码。也许我只是担心什么,而所有3个代码示例都做完全相同的事情?
ProcessEventsAsync看起来像这样:
async Task<InputResult> ProcessEventAsync(InputEvent ev) {...}
Task<InputResult>
与InputResult
属于定制类。
Select
了之前任务的结果 Where
。
Result
任务的属性