2011-07-20 30 views
5

Threading in C# by Joseph Albahari cuộc đàm phán ngắn gọn về nó, trong đó nêu:Cả hai BeginInvoke và EndInvoke trên các đại biểu có tạo ra hàng rào đầy đủ không?

Sau đây mặc nhiên tạo ra đầy đủ hàng rào:

  • C# 's khóa statement (Monitor.Enter/Monitor.Exit)
  • Tất cả các phương pháp trên lớp đan cài (chúng tôi sẽ bao gồm những điều này sớm)
  • Gọi lại không đồng bộ sử dụng nhóm chủ đề - bao gồm đại biểu không đồng bộ, gọi lại APM và tiếp tục Công việc
  • Thiết lập và chờ đợi vào một tín hiệu xây dựng
  • Bất cứ điều gì mà phụ thuộc vào tín hiệu, chẳng hạn như bắt đầu hoặc chờ đợi vào một nhiệm vụ

Như "đại biểu không đồng bộ" có trong danh sách, tôi muốn thừa nhận rằng ít nhất EndInvoke là đầy đủ hàng rào. Nhưng còn BeginInvoke thì sao? Thật không may tôi không thể F11 (= debug bước) vào mã BeginInvoke - là nguồn có sẵn ở đâu đó? Mặc dù một liên kết đến một câu trả lời rõ ràng sẽ còn tốt hơn nữa.

+1

(BeginInvoke được cung cấp bởi thời gian chạy của nó elf; không có bất kỳ nguồn nào như vậy) –

+0

Bạn có nghĩa là họ đã phát triển hai phương pháp đó trực tiếp trong mã máy? ;) Nhưng trung thực, nó sẽ được tốt đẹp để biết nếu có bất kỳ loại bảo đảm về an toàn thread, độc lập cho dù có một cách để xem xét các nguồn MS hay không. Tôi không thể tìm thấy từ 'rào chắn', 'hàng rào', 'dễ bay hơi' trong phân vùng II và IV của 'tiêu chuẩn mới nhất' hoặc 'bản nháp làm việc' mà tôi đã downlaoded từ [http://msdn.microsoft.com/ en-us/netframework/aa569283.aspx] –

+0

Không nhất thiết phải có mã máy, C hoặc C++. Nếu bạn thực sự muốn xem nó, bạn có thể tải xuống mã nguồn của Mono để xem chúng đã làm như thế nào. – codenheim

Trả lời

-1

MSDN nói BeginInvoke là threadsafe: http://msdn.microsoft.com/en-us/library/0b1bf3y3.aspx

có bốn phương pháp trên một điều khiển mà là thread an toàn: Gọi, BeginInvoke, EndInvoke, và CreateGraphics nếu xử lý cho kiểm soát đã được tạo

+1

Tôi tin rằng tác giả câu hỏi không hỏi về 'Control.BeginInvoke', mà là' BeginInvoke' và 'EndInvoke' của Delegate'. – paercebal

+0

Làm chủ đề an toàn không nói nhiều. – CodesInChaos

+1

Vâng, trong trường hợp này, tôi không quan tâm đến Control.BeginInvoke, nhưng Begin/EndInvoke trên các đại biểu. –

-1

mã nguồn toàn bộ khung có sẵn từ Microsoft tại Reference Source Website

+0

Trường hợp chính xác là mã nguồn cho BeginInvoke và EndInvoke? Tôi đang trên .net 3.5SP1, vì vậy tôi đã xem xét các nguồn cho ".NET_3.5_sp1_redist" - chúng không có trong đó. Giống như Marc Gravell nói, nó có lẽ nằm trong nguồn của bản thân thời gian chạy, không phải thư viện .net chạy trên nó (và tôi có thể tải về các nguồn cảm ơn liên kết của bạn). –

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