2009-08-30 49 views
5

Tôi bị nhầm lẫn với một số thuật ngữ trong khi đọc tài liệu MSDN và mẫu mã.Gọi lại đồng bộ và không đồng bộ

Gọi lại trong C# là gì? Đặc biệt, những lời gọi đồng bộ và không đồng bộ là gì?

Vui lòng giải thích những điều này từ quan điểm của giáo dân.

Ngoài ra, vui lòng giải thích giao diện IAsyncCallbackIAsyncResult. Làm cách nào để chúng tôi có thể triển khai? (với ví dụ rất đơn giản)

Xin cảm ơn trước.

Trả lời

13

Giao diện IAsyncCallback không tồn tại, do đó bạn không thể triển khai giao diện.

Tôi nghi ngờ rằng bạn thực sự muốn biết về số IAsyncResult interface.

Tôi khuyên bạn nên đọc this page trên MSDN.


Các IAsyncResult interface đại diện cho một hoạt động (ví dụ như yêu cầu web hoặc một cuộc gọi cơ sở dữ liệu) đang chạy ở chế độ nền, trong khi mã của bạn vẫn tiếp tục thực hiện. Nó có thể cho bạn biết liệu các hoạt động đã hoàn thành (thuộc tính IsCompleted). Nó cũng cung cấp cho bạn một số WaitHandle object (thuộc tính AsyncWaitHandle) có thể được sử dụng để chờ cho đến khi thao tác kết thúc. (Bằng cách gọi result.AsyncWaitHandle.WaitOne())

Bạn nhận được một IAsyncResult bằng cách gọi một phương pháp BeginWhatever. (BeginExecuteReader, BeginGetResponse và nhiều thứ khác). Phương pháp BeginWhatever sẽ lấy bất kỳ thông số nào cần thiết cho hoạt động (Ví dụ: BeginExecuteReader có thể tham số CommandBehavior) và có thể lấy đại diện AsyncCallback (không giao diện) và tham số trạng thái. Trả về một đối tượng IAsyncResult.

Đại biểu AsyncCallback là phương thức bạn cung cấp, phương thức này sẽ được gọi khi hoạt động kết thúc. Nó thường sẽ được gọi trên một chủ đề khác nhau, vì vậy hãy cẩn thận trong nó. Phương thức AsyncCallback của bạn sẽ được cung cấp cùng một IAsyncResult rằng phương thức BeginWhatever đã cung cấp cho bạn sớm hơn. Tham số trạng thái được đưa vào IAsyncResult và bị bỏ qua bởi hệ thống; bạn có thể sử dụng nó trong phương thức AsyncCallback để theo dõi hoạt động của nó.(Nhà nước có thể được bất cứ điều gì bạn muốn nó được, bao gồm null)

Bên AsyncCallback của bạn (hoặc bất cứ nơi nào khác), bạn có thể gọi phương thức EndWhatever tương ứng với phương pháp BeginWhatever bạn gọi trong địa điểm đầu tiên. Bạn phải cung cấp cho IAsyncResult từ BeginWhatever hoặc từ AsyncCallback. Khi bạn gọi nó, nó sẽ đợi hoạt động kết thúc (nếu nó chưa được hoàn thành), và sau đó cung cấp cho bạn kết quả của hoạt động. (Giả sử hoạt động trả về một cái gì đó, ví dụ: WebRequest.EndGetResponse sẽ trả về một số WebResponse). Nếu xảy ra bất kỳ lỗi nào trong quá trình hoạt động, EndWhatever sẽ ném một ngoại lệ.


Bạn sẽ triển khai IAsyncResult nếu bạn muốn tạo hoạt động của riêng mình có thể chạy trong nền. Bạn cũng sẽ tạo các phương thức BeginWhateverEndWhatever phương thức trả lại và lấy tương ứng. Để biết thêm thông tin về việc triển khai IAsyncResult, hãy xem here.

+0

Xin lỗi lỗi typo. Bạn đã nói tôi cần làm rõ trên IAsyncResult.Thank rất nhiều cho lời giải thích của bạn. – user160677

+2

Giải thích tuyệt vời cảm ơn bạn rất nhiều – user160677

2

Gọi lại không gì khác ngoài đại biểu. Thuật ngữ gọi lại được sử dụng bởi vì bạn thường chuyển nó (đại biểu) vào một phương thức (như một đối số) và sau đó được gọi trong phương thức đó để báo hiệu một cái gì đó.

Gọi lại đồng bộ và không đồng bộ. Đồng bộ, thực hiện trên cùng một luồng được gọi là phương thức (đã bắt đầu hành động). Đồng bộ hóa thường được thực hiện trên một chuỗi khác (nhưng không phải lúc nào)

Giao diện IAsyncCallback là mẫu để khởi tạo tác vụ không đồng bộ. Bạn vượt qua trong một cuộc gọi lại (delegate) được gọi khi công việc hoàn tất. Có một thuộc tính để xác định xem phương thức có thực thi đồng bộ hay không.

+0

Cảm ơn bạn rất nhiều – user160677

4

Với gọi lại đồng bộ, phương thức gọi (hoặc chuỗi) phải chờ cho đến khi phương thức được gọi hoàn thành trước khi nó có thể tiếp tục xử lý - giống như cuộc gọi phương thức "thông thường".

Với gọi lại không đồng bộ, phương thức gọi (hoặc chuỗi) có thể xử lý các đầu vào hoặc sự kiện khác hoặc bất kỳ điều gì mà không cần đợi phương thức được gọi hoàn thành.

Đối với một ứng dụng Giao diện người dùng chủ đề nếu bạn không muốn nó "đóng băng" trong khi ứng dụng đang thực hiện một số quy trình dài, bạn cần sử dụng gọi lại không đồng bộ.

+1

Cảm ơn Chris vì lời giải thích của bạn – user160677

+0

Không vấn đề gì - có nhiều điều hơn thế nữa và tôi khuyên bạn nên đọc thêm về MSDN và tìm kiếm ở đây các câu hỏi về đa luồng. – ChrisF

+0

Chắc chắn tôi sẽ đi qua MSDN như đề xuất. Cảm ơn rất nhiều – user160677

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