Tôi nghĩ rằng sự thật còn mơ hồ ngay cả từ tài liệu của Microsoft:
Trong Visual Studio 2012 và .NET Framework 4.5, bất kỳ phương thức nào được gán với async
từ khóa ( Async
trong Visual Basic) được coi là phương thức không đồng bộ và trình biên dịch C # và Visual Basic thực hiện các biến đổi cần thiết để triển khai phương thức không đồng bộ bằng cách sử dụng TAP. Một phương thức không đồng bộ sẽ trả về một Task
hoặc một Task<TResult>
đối tượng.
http://msdn.microsoft.com/en-us/library/hh873177(v=vs.110).aspx
Điều đó không đúng rồi. Bất kỳ phương pháp với async
là không đồng bộ và sau đó nó nói rằng nó phải trả lại hoặc là một Task
hay Task<T>
- mà không phải là phù hợp với phương pháp ở trên cùng của một cuộc gọi stack, Button_Click ví dụ, hoặc async void
.
Tất nhiên, bạn phải xem xét điểm của quy ước là gì?
Bạn có thể nói rằng Async
quy ước hậu tố là để thông báo với người dùng API rằng phương thức này có thể chờ được. Đối với một phương thức có thể chờ đợi được, nó phải trả về giá trị Task
trống hoặc Task<T>
đối với phương thức trả về giá trị, có nghĩa là chỉ phương thức sau mới có thể được gắn với Async
.
Hoặc bạn có thể nói rằng Async
quy ước hậu tố là để thông báo rằng phương thức có thể trả về ngay lập tức, từ bỏ luồng hiện tại để thực hiện công việc khác và có khả năng gây ra các cuộc đua.
Trích dẫn tài liệu của Microsoft này cho biết:
Theo quy ước, bạn thêm "Async" vào tên của các phương thức có công cụ sửa đổi Async hoặc async.
http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
Điều này thậm chí còn không đề cập đến việc các phương thức không đồng bộ của riêng bạn trả về Task
cần Async
hậu tố, điều mà tôi nghĩ tất cả chúng ta đều đồng ý.
Vì vậy, câu trả lời cho câu hỏi này có thể là: cả hai. Trong cả hai trường hợp, bạn cần thêm Async
các phương thức có async
từ khóa và trả về Task
hoặc Task<T>
.
Tôi sẽ hỏi Stephen Toub để làm rõ tình hình.
Cập nhật
Tôi cũng vậy. Và đây là những gì người đàn ông tốt của chúng ta đã viết:
Nếu một phương thức công khai là trả về Tác vụ và có bản chất là không đồng bộ (trái ngược với một phương thức được biết là luôn thực thi đồng bộ cho đến khi hoàn thành nhưng vẫn trả về một Tác vụ vì lý do nào đó), thì nó phải có hậu tố “Không đồng bộ”. Đó là kim chỉ nam. Mục tiêu chính ở đây với việc đặt tên là làm cho người tiêu dùng hiểu rõ về chức năng rằng phương thức được gọi có thể sẽ không hoàn thành đồng bộ tất cả công việc của nó; tất nhiên nó cũng hữu ích trong trường hợp chức năng được hiển thị với cả phương thức đồng bộ và không đồng bộ, do đó bạn cần sự khác biệt về tên để phân biệt chúng. Cách phương thức đạt được sự triển khai không đồng bộ của nó là không quan trọng đối với việc đặt tên: liệu async / await được sử dụng để thu hút sự trợ giúp của trình biên dịch hay liệu các kiểu và phương thức từ System.Threading.Tasks được sử dụng trực tiếp (e. g. TaskCompletionSource) không thực sự quan trọng, vì điều đó không ảnh hưởng đến chữ ký của phương pháp đối với người tiêu dùng phương thức.
Tất nhiên, luôn có những ngoại lệ đối với một hướng dẫn. Điều đáng chú ý nhất trong trường hợp đặt tên sẽ là các trường hợp mà nguyên tắc đặc biệt của toàn bộ loại là cung cấp chức năng tập trung vào không đồng bộ, trong trường hợp này có Không đồng bộ trên mọi phương thức sẽ là quá mức cần thiết, ví dụ như các phương thức trên chính Tác vụ tạo ra các Tác vụ khác .
Đối với các phương thức không đồng bộ trả về void-return, không mong muốn có các phương thức đó trong khu vực bề mặt công khai, vì người gọi không có cách nào tốt để biết khi nào công việc không đồng bộ đã hoàn thành. Tuy nhiên, nếu bạn phải công khai một phương thức không đồng bộ trả về void trả về công khai, bạn có thể muốn có một tên truyền tải rằng công việc không đồng bộ đang được bắt đầu và bạn có thể sử dụng hậu tố “Async” ở đây nếu nó hợp lý. Vì trường hợp này hiếm khi xảy ra, tôi cho rằng đó thực sự là một loại quyết định theo từng trường hợp.
Tôi hy vọng điều đó sẽ giúp, Steve
Lời dẫn ngắn gọn từ câu mở đầu của Stephen đủ rõ ràng. Nó loại trừ async void
vì việc muốn tạo một API công khai với thiết kế như vậy là không bình thường vì cách chính xác để triển khai khoảng trống không đồng bộ là trả về một thể hiện đơn giản Task
và để trình biên dịch hoạt động hiệu quả. Tuy nhiên, nếu bạn muốn một public async void
, thì Async
nên bổ sung. Các async void
phương thức top-of-stack khác như trình xử lý sự kiện thường không công khai và không quan trọng / đủ điều kiện.
Đối với tôi, nó cho tôi biết rằng nếu tôi thấy mình băn khoăn về việc thêm hậu tố Async
vào một async void
, có lẽ tôi nên chuyển nó thành một async Task
để người gọi có thể chờ đợi nó, sau đó thêm vào Async
.