2012-02-10 45 views
36

Duyệt qua kênh 9 msdn video Tôi tìm thấy nhận xét chưa được trả lời sau đây và hy vọng ai đó có thể giải thích được?Tại sao từ khóa không đồng bộ tồn tại

Tôi không nhận được điểm của từ khóa không đồng bộ. Tại sao không chỉ cho phép chờ từ khóa bất cứ khi nào phương thức trả về Tác vụ, giống như trình vòng lặp có thể mang lại lợi nhuận trên bất kỳ phương thức nào trả về IEnumerable.

Tôi chắc chắn có lý do chính đáng, tôi chỉ muốn hiểu tại sao đề xuất trên không thể thực hiện được.

+8

Cảm giác của tôi là ngứa ran ... Jon Skeet đang trên đường tới! Trong khi tất cả chúng ta chờ đợi, hãy đọc thêm một chút: http://blogs.msdn.com/b/ericlippert/archive/2010/10/29/asynchronous-programming-in-c-5-0-part-two-whence- await.aspx –

+1

Cần hai từ khóa ở các vị trí riêng biệt để triển khai một tính năng mới có vẻ như là một lựa chọn thiết kế tồi. Thực tế là có khá nhiều người đang đặt câu hỏi này có nghĩa là (với tôi) rằng sự lựa chọn sai đã được thực hiện. Đọc qua tất cả các lý do trong các blog, tôi có thể làm theo logic, nhưng thỏa hiệp không phải lúc nào cũng là kế hoạch tốt nhất. Đôi khi tốt hơn là phá vỡ một số mã và tiếp tục. – adelphus

+1

Cá nhân tôi nghĩ rằng sự lựa chọn an toàn nhất đã được thực hiện. Nếu tất cả những gì đứng giữa mã phá vỡ và không phá vỡ mã là một từ khóa đơn giản, thì đó không phải là quá nặng nề một nhiệm vụ. Mọi người có thể hát về nó, nhưng người ta có thể cho rằng họ sẽ không gặp phải vấn đề tương thích ngược. Rất nhiều người đồng ý hoặc vô tư không phải là giọng hát. –

Trả lời

19

Nó được giới thiệu chủ yếu là để tránh các vấn đề tương thích ngược. Nếu async -ness của một phương thức phải được trình biên dịch phỏng đoán (có thể thông qua việc phát hiện từ khóa await), thì có các tình huống tinh tế khi mã hiện tại đột nhiên được xử lý khác nhau, đặc biệt là khi bạn có số nhận dạng (tên biến hoặc tên hàm) được gọi là await).

Một giải thích đầy đủ là ở đây: http://blogs.msdn.com/b/ericlippert/archive/2010/11/11/whither-async.aspx

15

Tôi nghĩ có lẽ bài viết này bao gồm các lập luận:

http://blogs.msdn.com/b/ericlippert/archive/2010/11/11/whither-async.aspx

Các trạng thái đoạn đầu tiên:

Một số người đã hỏi tôi điều gì thúc đẩy các quyết định thiết kế để yêu cầu bất kỳ phương pháp có chứa biểu thức "đang chờ" được đặt tiền tố với từ khóa theo ngữ cảnh "không đồng bộ".

Nó kết luận:

Đó là một toàn bộ rất nhiều ưu và khuyết điểm; sau khi đánh giá tất cả chúng và rất nhiều lượt chơi với trình biên dịch nguyên mẫu để xem cảm giác của nó như thế nào, các nhà thiết kế C# đã giải quyết yêu cầu "không đồng bộ" trên phương thức chứa một "đang chờ". Tôi nghĩ đó là một sự lựa chọn hợp lý.

Ngắn gọn là khả năng tương thích ngược.

Tiếp tục đọc:

http://blogs.msdn.com/b/ericlippert/archive/2010/10/29/asynchronous-programming-in-c-5-0-part-two-whence-await.aspx

+4

+1. Trích dẫn Eric Lippert là điều tốt nhất tiếp theo * * Eric Lippert :) – Benjol

+8

Tôi chỉ muốn thêm rằng tôi rất mong muốn các nhà thiết kế C# 2 đã quyết định đặt "iterator" hoặc một số từ khóa tương tự ở đầu mỗi phương pháp là một trình lặp. Nó rất vexing phải phân tích cú pháp * tiềm năng toàn bộ cơ thể phương pháp * trước khi bạn biết liệu nó là một khối lặp hay không. –

+1

Chưa kể nó sẽ cho phép các phương thức nặc danh trở thành trình lặp. –

8

Đối với tôi, những lý do thuyết phục nhất là ý nghĩa của báo cáo kết quả return thay đổi khi một hàm trở nên async. Nếu không có asnycreturn x có nghĩa là "trả về một nhiệm vụ với giá trị x", và với async nó có nghĩa là "thiết lập các kết quả của nhiệm vụ để x.

2

Tôi đã viết lên một summary of async/await keyword questions trên blog của tôi một thời gian trước đây.

Dưới đây là kết luận của phần "Inferring async":

Eric Lippert có definitive post về chủ đề này.Nó cũng đã được thảo luận trong blog comments, Channel9forums.

Để tóm tắt, một từ khóa await từ khóa sẽ quá lớn so với thay đổi đột phá. Lựa chọn giữa một từ chờ đợi nhiều từ (ví dụ: await for) hoặc từ khóa trên phương thức (async) sẽ bật từ khóa await chỉ trong phương thức đó. Các phương pháp đánh dấu rõ ràng async dễ dàng hơn cho cả người và máy tính để phân tích cú pháp, vì vậy họ quyết định đi theo cặp async/await.

Các vấn đề liên quan