Để học nhanh nhất ..
Hiểu luồng thực thi phương thức (có sơ đồ): 3 phút
Câu hỏi nội tâm (lợi ích học tập): 1 phút
Nhanh chóng thông qua cú pháp đường: 5 phút
Chia sẻ sự nhầm lẫn của một nhà phát triển: 5 phút
Vấn đề: Nhanh chóng thay đổi triển khai mã thông thường trong thế giới thực sang mã Async: 2 phút
Tiếp theo là đâu?
Hiểu luồng thực thi phương thức (có sơ đồ): 3 phút
Trong hình ảnh này, chỉ cần tập trung vào # 6 (không có gì hơn)
Ở bước thứ 6: Việc thực thi dừng ở đây vì nó đã hết việc. Để tiếp tục, nó cần một kết quả từ getStringTask (loại hàm). Do đó, nó sử dụng một await
toán tử để tạm dừng tiến trình của nó và trả lại quyền điều khiển (năng suất) cho người gọi (của phương thức này mà chúng tôi đang thực hiện). Cuộc gọi thực tế đến getStringTask đã được thực hiện trước đó ở # 2. Ở # 2, một lời hứa đã được thực hiện để trả về kết quả chuỗi. Nhưng khi nào nó sẽ trả về kết quả? Chúng ta có nên (# 1: AccessTheWebAsync) thực hiện lại cuộc gọi thứ 2 không? Ai nhận được kết quả, # 2 (tuyên bố gọi) hoặc # 6 (chờ tuyên bố)
Trình gọi bên ngoài của AccessTheWebAsync () cũng đang chờ. Vì vậy, người gọi đang chờ AccessTheWebAsync và AccessTheWebAsync đang chờ GetStringAsync vào lúc này. Điều thú vị là AccessTheWebAsync đã thực hiện một số công việc trước khi chờ đợi (# 4) có lẽ để tiết kiệm thời gian chờ đợi. Sự tự do tương tự đối với đa nhiệm cũng có sẵn cho người gọi bên ngoài (và tất cả những người gọi trong chuỗi) và đây là điểm cộng lớn nhất của điều 'không đồng bộ' này! Bạn cảm thấy như nó là đồng bộ..hoặc bình thường nhưng không phải vậy.
Hãy nhớ rằng, phương thức đã được trả về (# 2), nó không thể quay lại lần nữa (không có lần thứ hai). Vậy người gọi sẽ biết như thế nào? Đó là tất cả về Nhiệm vụ! Nhiệm vụ đã được thông qua. Nhiệm vụ đã được chờ đợi (không phải phương thức, không phải giá trị). Giá trị sẽ được đặt trong Nhiệm vụ. Trạng thái nhiệm vụ sẽ được thiết lập để hoàn thành. Người gọi chỉ cần theo dõi Nhiệm vụ (# 6). Vì vậy, 6 # là câu trả lời cho nơi / ai nhận được kết quả. Đọc thêm cho sau này ở đây .
Câu hỏi nội tâm cho việc học vì lợi ích: 1 phút
Hãy để chúng tôi điều chỉnh câu hỏi một chút:
Làm thế nào và khi nào sử dụng và ? async
await
Tasks
Bởi vì việc học Task
tự động bao gồm hai điều còn lại (và trả lời câu hỏi của bạn)
Nhanh chóng thông qua cú pháp đường: 5 phút
Trước khi chuyển đổi (phương thức ban đầu)
internal static int Method(int arg0, int arg1)
{
int result = arg0 + arg1;
IO(); // Do some long running IO.
return result;
}
một phương thức Nhiệm vụ để gọi phương thức trên
internal static Task<int> MethodTask(int arg0, int arg1)
{
Task<int> task = new Task<int>(() => Method(arg0, arg1));
task.Start(); // Hot task (started task) should always be returned.
return task;
}
Chúng tôi đã đề cập đến chờ đợi hoặc không đồng bộ? Không. Gọi phương thức trên và bạn nhận được một nhiệm vụ mà bạn có thể theo dõi. Bạn đã biết những gì nhiệm vụ trả về .. một số nguyên.
Gọi một nhiệm vụ hơi khó khăn và đó là khi các từ khóa bắt đầu xuất hiện. Hãy để chúng tôi gọi Phương thức ()
internal static async Task<int> MethodAsync(int arg0, int arg1)
{
int result = await HelperMethods.MethodTask(arg0, arg1);
return result;
}
Cùng một mã ở trên được thêm vào như hình ảnh dưới đây:
- Chúng tôi đang 'chờ' nhiệm vụ được hoàn thành. Vì thế
await
- Vì chúng tôi sử dụng await, chúng tôi phải sử dụng
async
(cú pháp bắt buộc)
- Phương thức Đồng bộ hóa với
Async
tư cách là tiền tố (tiêu chuẩn mã hóa)
await
là dễ hiểu nhưng hai ( async
, Async
) còn lại có thể không :). Chà, nó sẽ có ý nghĩa hơn nhiều đối với trình biên dịch mặc dù. Đọc thêm cho lần sau tại đây
Vậy là có 2 phần.
- Tạo 'Nhiệm vụ'
- Tạo đường cú pháp để gọi tác vụ (
await+async
)
Hãy nhớ rằng, chúng tôi đã có một người gọi bên ngoài đến AccessTheWebAsync () và người gọi đó cũng không được tha thứ ... tức là nó cũng cần như await+async
vậy. Và chuỗi tiếp tục. Nhưng sẽ luôn có một Task
kết thúc.
Tất cả đều ổn, nhưng một nhà phát triển đã ngạc nhiên khi thấy # 1 (Nhiệm vụ) bị thiếu ...
Chia sẻ sự nhầm lẫn của một nhà phát triển: 5 phút
Một nhà phát triển đã phạm sai lầm khi không thực hiện Task
nhưng nó vẫn hoạt động! Cố gắng hiểu câu hỏi và chỉ câu trả lời được chấp nhận được cung cấp ở đây . Hy vọng bạn đã đọc và hiểu đầy đủ. Tóm tắt là chúng ta có thể không thấy / triển khai 'Nhiệm vụ' nhưng nó được triển khai ở đâu đó trong lớp cha. Tương tự như vậy trong ví dụ của chúng ta, việc gọi một phương thức đã được xây dựng MethodAsync()
dễ dàng hơn nhiều so với việc thực hiện phương thức đó với một Task
( MethodTask()
) chính chúng ta. Hầu hết các nhà phát triển cảm thấy khó khăn để có được đầu óc của họ Tasks
trong khi chuyển đổi mã thành mã không đồng bộ.
Mẹo: Cố gắng tìm một triển khai Async hiện có (như MethodAsync
hoặc ToListAsync
) để thuê ngoài độ khó. Vì vậy, chúng ta chỉ cần xử lý Async và chờ đợi (dễ dàng và khá giống với mã thông thường)
Vấn đề: Nhanh chóng thay đổi triển khai mã thông thường trong thế giới thực sang hoạt động Async: 2 phút
Dòng mã hiển thị bên dưới trong Lớp dữ liệu bắt đầu bị phá vỡ (nhiều nơi). Bởi vì chúng tôi đã cập nhật một số mã của chúng tôi từ .Net framework 4.2. * Thành .Net core. Chúng tôi đã phải sửa lỗi này trong 1 giờ trên toàn bộ ứng dụng!
var myContract = query.Where(c => c.ContractID == _contractID).First();
dễ như ăn bánh!
- Chúng tôi đã cài đặt gói nuget EntityFramework vì nó có QueryableExtensions. Hay nói cách khác, nó thực hiện Async (tác vụ), vì vậy chúng ta có thể tồn tại với mã đơn giản
Async
và await
bằng mã.
- không gian tên = Microsoft.EntityFrameworkCore
dòng mã gọi đã thay đổi như thế này
var myContract = await query.Where(c => c.ContractID == _contractID).FirstAsync();
Chữ ký phương thức thay đổi từ
Contract GetContract(int contractnumber)
đến
async Task<Contract> GetContractAsync(int contractnumber)
phương thức gọi cũng bị ảnh hưởng: GetContractAsync(123456);
được gọi làGetContractAsync(123456).Result;
Chúng tôi đã thay đổi nó ở khắp mọi nơi trong 30 phút!
Nhưng kiến trúc sư bảo chúng tôi không sử dụng thư viện EntityFramework chỉ cho việc này! Giáo sư! kịch! Sau đó, chúng tôi đã thực hiện một nhiệm vụ tùy chỉnh (yuk). Mà bạn biết làm thế nào. Vẫn dễ! .. cho đến khi bạn
Tiếp theo là đâu?
Có một video nhanh tuyệt vời mà chúng ta có thể xem về Chuyển đổi các cuộc gọi đồng bộ thành không đồng bộ trong Lõi ASP.Net , có lẽ đó là hướng đi mà người ta sẽ đi sau khi đọc điều này.