Tôi cần sửa đổi một chương trình hiện có và nó chứa mã sau đây:
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
Nhưng điều này có vẻ rất kỳ lạ đối với tôi, trước hết là việc sử dụng async
và await
trong việc lựa chọn. Theo câu trả lời này của Stephen Cleary tôi sẽ có thể bỏ những thứ đó.
Sau đó, thứ hai Select
chọn kết quả. Điều này không có nghĩa là nhiệm vụ hoàn toàn không đồng bộ và được thực hiện đồng bộ (rất nhiều nỗ lực không có gì), hoặc nhiệm vụ sẽ được thực hiện không đồng bộ và khi hoàn thành phần còn lại của truy vấn?
Tôi có nên viết đoạn mã trên như sau theo một câu trả lời khác của Stephen Cleary :
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
và nó hoàn toàn giống như thế này?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
Trong khi tôi đang làm việc trong dự án này, tôi muốn thay đổi mẫu mã đầu tiên nhưng tôi không quá quan tâm đến việc thay đổi mã async (làm việc một cách tự nhiên). Có lẽ tôi chỉ lo lắng không có gì và cả 3 mẫu mã đều làm chính xác như vậy?
ProcessEventsAsync trông như thế này:
async Task<InputResult> ProcessEventAsync(InputEvent ev) {...}
Task<InputResult>
với InputResult
là một lớp tùy chỉnh.
Select
kết quả từ các nhiệm vụ trước của bạn Where
.
Result
tài sản của nhiệm vụ