Tôi nghĩ rằng về cơ bản chúng giống nhau - viết các chương trình phân chia nhiệm vụ giữa các bộ xử lý (trên các máy có bộ xử lý 2+). Sau đó, tôi đang đọc này , trong đó nói:
Các phương thức Async được dự định là các hoạt động không chặn. Biểu thức chờ trong phương thức async không chặn luồng hiện tại trong khi tác vụ được chờ đang chạy. Thay vào đó, biểu thức đăng ký phần còn lại của phương thức dưới dạng tiếp tục và trả lại quyền điều khiển cho người gọi phương thức async.
Các từ khóa không đồng bộ và chờ đợi không gây ra các chủ đề bổ sung được tạo. Các phương thức async không yêu cầu đa luồng vì một phương thức async không chạy trên luồng của chính nó. Phương thức chạy trên bối cảnh đồng bộ hóa hiện tại và chỉ sử dụng thời gian trên luồng khi phương thức được kích hoạt. Bạn có thể sử dụng Task.Run để di chuyển công việc gắn với CPU sang luồng nền, nhưng luồng nền không giúp ích gì cho quá trình chỉ chờ kết quả khả dụng.
và tôi tự hỏi liệu ai đó có thể dịch nó sang tiếng Anh cho tôi không. Nó dường như rút ra sự khác biệt giữa tính không đồng bộ (đó có phải là một từ không?) Và phân luồng và ngụ ý rằng bạn có thể có một chương trình có các tác vụ không đồng bộ nhưng không có đa luồng.
Bây giờ tôi hiểu ý tưởng về các tác vụ không đồng bộ như ví dụ trên pg. C # của Jon Skeet C # In Depth, Ấn bản thứ ba
async void DisplayWebsiteLength ( object sender, EventArgs e )
{
label.Text = "Fetching ...";
using ( HttpClient client = new HttpClient() )
{
Task<string> task = client.GetStringAsync("http://csharpindepth.com");
string text = await task;
label.Text = text.Length.ToString();
}
}
Các async
phương tiện từ khóa " chức năng này, bất cứ khi nào nó được gọi là, sẽ không được gọi là trong bối cảnh, trong đó hoàn thành là cần thiết cho tất cả mọi thứ sau khi cuộc gọi của nó được gọi."
Nói cách khác, viết nó ở giữa một số nhiệm vụ
int x = 5;
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);
, vì DisplayWebsiteLength()
không có gì để làm với x
hoặc y
, sẽ khiến DisplayWebsiteLength()
được thực thi "trong nền", như
processor 1 | processor 2
-------------------------------------------------------------------
int x = 5; | DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0); |
Rõ ràng đó là một ví dụ ngu ngốc, nhưng tôi đúng hay tôi hoàn toàn bối rối hay sao?
(Ngoài ra, tôi bối rối về lý do sender
và e
không bao giờ được sử dụng trong phần thân của chức năng trên.)
sender
và e
đang gợi ý rằng đây thực sự là một công cụ xử lý sự kiện - gần như là nơi duy nhất async void
được mong muốn. Rất có thể, điều này được gọi bằng một lần bấm nút hoặc đại loại như thế - kết quả là hành động này xảy ra hoàn toàn không đồng bộ đối với phần còn lại của ứng dụng. Nhưng đó vẫn là tất cả trên một luồng - luồng UI (với một chút thời gian nhỏ trên luồng IOCP đăng cuộc gọi lại lên luồng UI).
DisplayWebsiteLength
mẫu mã: Bạn không nên sử dụng HttpClient
trong một using
câu lệnh - Trong một tải nặng, mã có thể làm cạn kiệt số lượng ổ cắm có sẵn dẫn đến lỗi SocketException. Thông tin thêm về Khởi tạo không đúng cách .