Có thể vượt qua các tham số, với await? PROS và TIÊU DÙNG để làm điều này là gì?
var results = MapResults(await GetDataAsync());
var result = await GetDataAsync(); var map = MapResults(result)
Có thể vượt qua các tham số, với await? PROS và TIÊU DÙNG để làm điều này là gì?
var results = MapResults(await GetDataAsync());
var result = await GetDataAsync(); var map = MapResults(result)
Câu trả lời:
CẬP NHẬT: Câu hỏi này là chủ đề của blog của tôi vào tháng 3 năm 2020 . Xem nó để thảo luận thêm về vấn đề này. Cảm ơn câu hỏi thú vị!
Tôi sẽ giả định ở đây rằng bạn dự định là một hàm gọi là thành viên duy nhất của danh sách đối số.
Như những người khác đã lưu ý, không có sự khác biệt giữa
x = M(await FAsync());
và
var f = await FAsync();
x = M(f);
Và điều đó cũng giống như
var ftask = FAsync();
x = M(await ftask)
Vì vậy, nó không quan trọng bằng cách bạn viết nó, đúng không?
Hãy suy nghĩ một chút.
Trong kịch bản cụ thể đó, cả ba quy trình công việc đều giống nhau. Nhưng có một sự khác biệt tiềm năng ở đây nếu chúng ta chỉ thay đổi một chút kịch bản. Xem xét:
x = M(await FAsync(), await GAsync());
Điều này giống như
var f = await FAsync();
var g = await GAsync();
x = M(f, g);
và chúng ta biết gì về quy trình làm việc này? Tác vụ GAsync không được bắt đầu cho đến khi tác vụ FAsync kết thúc! Nhưng có vẻ như có một cơ hội để có hai nhiệm vụ diễn ra cùng một lúc ở đây, có thể sử dụng luồng hiện tại hiệu quả hơn! Có khả năng quy trình làm việc sẽ được viết tốt hơn như sau:
var ftask = FAsync();
var gtask = GAsync();
x = M(await ftask, await gtask);
Bây giờ cả hai nhiệm vụ FAsync và GAsync đều bắt đầu và chúng tôi không gọi M cho đến khi cả hai kết thúc.
Lời khuyên của tôi là suy nghĩ cẩn thận về nơi bạn chờ đợi. Hãy nhớ rằng, sự chờ đợi được dự định là một điểm trong quy trình làm việc không đồng bộ trong đó quy trình công việc tạm dừng không đồng bộ cho đến khi điều kiện tiên quyết của việc tiếp tục được đáp ứng . Nếu bạn có thể trì hoãn chờ đợi một nhiệm vụ cho đến khi nó thực sự là một điều kiện tiên quyết, bạn có thể có được một chiến thắng hiệu suất.
SqlConnectionhoặc DbContextví dụ.
Không có sự khác biệt về thời gian chạy giữa;
var results = MapResults(await GetDataAsync())
và
var tmp = await GetDataAsync();
var results = MapResults(tmp)
GetDataAsync) và không gọi phương thức. Tùy thuộc vào nơi Task GetDataAsync = CallSomeAsync()được khởi tạo, có thể có sự khác biệt đáng kể vì tác vụ sẽ được chạy theo thời gian MapResults(await GetDataAsync)được gọi. Xem câu trả lời của Eric để biết thêm chi tiết.