2009-12-10 34 views
12

Tôi cần biết liệu các cuộc gọi Control.BeginInvoke và Control.Invoke sẽ thực hiện theo thứ tự chúng được gọi.Sẽ có nhiều Control.BeginInvoke/Gọi các cuộc gọi được thực hiện theo thứ tự?

Tôi có các tình huống sau:

  1. UI thread chặn
  2. WCF chủ đề kêu gọi Control.BeginInvoke
  3. WCF chủ đề kêu gọi Control.Invoke (hoặc có thể BeginInvoke một lần nữa)
  4. UI thread đã bỏ chặn
  5. ??

Thứ tự thực hiện của bước 1-4 được đảm bảo theo thứ tự được hiển thị (về mặt kỹ thuật, thứ tự không được bảo đảm theo cách đó, nhưng câu hỏi tôi có chỉ liên quan nếu đơn hàng được hiển thị).

Câu hỏi tôi có là liệu có bất kỳ cơ hội nào mà lệnh Gọi/GọiInInoke ở bước 3 được thực hiện trước lệnh gọi BeginInvoke ở bước 2 không?

Ngoài ra, vui lòng không nhận xét về việc chặn chuỗi giao diện người dùng.

Trả lời

10

Trong trường hợp của bạn, bước 2 sẽ luôn thực thi trước bước 3. BeginInvoke trên chuỗi giao diện người dùng sẽ thực hiện theo thứ tự nó đã được xếp hàng đợi.

Chuỗi giao diện người dùng thực tế là một máy bơm tin nhắn, nó có một hàng đợi tin nhắn duy nhất với chỉ một chủ đề tiêu thụ nó, vì vậy nó đảm bảo rằng các mục công việc sẽ được thực hiện theo thứ tự chúng được xếp hàng đợi.

It's with Delegate.BeginInvoke rằng thứ tự thực thi có thể không theo tuần tự.

+0

Vì vậy, nhận xét nói rằng các cuộc gọi Invoke đồng bộ có thể được thực hiện trước khi cuộc gọi BeginInvoke không đồng bộ không áp dụng cho Control.BeginInvoke, nhưng nó sẽ áp dụng cho Delegate.BeginInvoke? Bạn có thể cung cấp cho tôi liên kết giải thích điều này không? – cornergraf

+0

Tuyên bố của bạn là chính xác. Tôi đã thêm một lời giải thích ngắn gọn về máy bơm tin nhắn UI trong câu trả lời, thật lạ lùng là tôi không thể tìm thấy nguồn chính thức nói rõ nó. –

+0

Ok, cảm ơn. Tôi biết về MessagePump nói chung, nhưng tôi nghĩ rằng BeginInvoke/Invoke cuộc gọi có khả năng có thể có hành vi đặc biệt vì lý do gì và tôi muốn chắc chắn – cornergraf

0

Không đủ thông tin để cung cấp cho bạn câu trả lời hay. Chuỗi giao diện người dùng bị chặn do đó các bước 2 và 3 phải đang chạy trên một chuỗi khác. Nếu không có sự đồng bộ giữa hai, thì làm thế nào chúng ta có thể biết bất kỳ thứ tự nào?

Thread 1  Thread 2      Thread 3   Thread 4 
Block UI  Calls BeginInvoke    
Unblock UI  Calls Invoke or BeginInvoke BeginInvoke runs BeginInvoke runs 

Bạn có nhiều thứ song song đang diễn ra, nhưng từ những gì bạn đã mô tả, chúng tôi không thể nói cho bạn biết điều gì có thể xảy ra, nói ngắn gọn, "Mọi thứ". Chúng tôi thậm chí không thể cho bạn biết rằng các cuộc gọi đến BeginInvoke sẽ không xảy ra trước khi chuỗi giao diện người dùng bị chặn hoặc sau khi chuỗi giao diện người dùng bị bỏ chặn.

+0

Vâng, thứ tự các bước 1-4 được đảm bảo xảy ra theo thứ tự đó. Câu hỏi đặt ra là chỉ cho dù điều này cũng sẽ đảm bảo thứ tự thực hiện của các cuộc gọi BeginInvoke/Invoke trong bước 3 và 4. Tôi đang cập nhật câu hỏi để làm cho điều này rõ ràng hơn. – cornergraf

+0

Ahhh, bản chỉnh sửa cho biết đó là 'Control.BeginInvoke' và' Control.Invoke' thay đổi rất nhiều. Vui mừng ai đó đã có thể bao gồm nó cho bạn. :) –

+0

Vâng, và tôi chỉ nhận ra lần nữa có bao nhiêu người có khuynh hướng lấy một số thông tin nhất định khi được thảo luận với người khác. Tôi sẽ cố gắng chính xác hơn trong tương lai. Cảm ơn phản ứng của bạn mặc dù. – cornergraf

3

BeginInvoke các cuộc gọi được xếp hàng đợi trên chuỗi đích (khi chúng được đăng theo thứ tự đến).

Cuộc gọi đồng bộ trên Chủ đề WCF (bước 3) có thể được thực thi trước các cuộc gọi không đồng bộ (bước 2) được thực hiện từ chuỗi này.

+0

Ok, cảm ơn rất nhiều. Bạn sẽ có một nguồn cho tuyên bố đó? Tôi đã cố gắng tìm một cái gì đó xác định trên google, nhưng không thành công cho đến nay. – cornergraf

0

Không có cơ hội nào bạn có thể giả định nhưng nếu thực tế có một số dạng phụ thuộc giữa hai cuộc gọi ở trên thì chúng sẽ đợi trên semaphore và chỉ thực thi mã phụ thuộc khi chúng được hoàn thành.

Nếu lý do tại sao bạn thực hiện hai cuộc gọi cùng một lúc không phải là hiệu suất thì tôi có thể chỉ thực hiện cuộc gọi thứ hai trong hàm gọi lại đầu tiên (làm cho việc gỡ lỗi dễ dàng hơn nhiều).

+0

thực sự, bước 3 và 4 có thể được hoán đổi, nhưng nếu chúng tôi biết rằng (rõ ràng) bước 2 sẽ thực hiện trước. Do đó câu hỏi của tôi chỉ có liên quan trong trường hợp thứ tự thực hiện được trình bày chính xác, đó là lý do tại sao tôi nói nó theo cách đó – cornergraf

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