2009-04-23 60 views
26

Sử dụng C# 2.0 và ủy nhiệm MethodInvoker, tôi có một ứng dụng GUI nhận một số sự kiện từ luồng GUI hoặc từ một chuỗi công nhân.Sử dụng C# MethodInvoker.Invoke() cho ứng dụng GUI ... có tốt không?

tôi sử dụng mô hình sau đây để xử lý sự kiện trong các hình thức:

private void SomeEventHandler(object sender, EventArgs e) 
{ 
    MethodInvoker method = delegate 
     { 
      uiSomeTextBox.Text = "some text"; 
     }; 

    if (InvokeRequired) 
     BeginInvoke(method); 
    else 
     method.Invoke(); 
} 

Bằng cách sử dụng mô hình này tôi không lặp lại mã UI thực tế nhưng những gì tôi không chắc chắn về là nếu phương pháp này là tốt .

Đặc biệt, dòng

method.Invoke() 

nó sử dụng thread khác cho cách gọi hay nó dịch hơi một cuộc gọi trực tiếp tới các phương pháp trên thread GUI?

Trả lời

21

Cuộc gọi method.Invoke() thực hiện ủy quyền trên chuỗi thực thi hiện tại. Sử dụng BeginInvoke(method) đảm bảo rằng đại biểu được gọi trên luồng GUI.

Đây là cách đúng để tránh trùng lặp mã khi cùng một phương pháp có thể được gọi cả từ chuỗi GUI và các chủ đề khác.

+0

Cảm ơn! Tôi đã bị mắc kẹt trên bằng cách sử dụng method.Invoke và thậm chí Invoke ((MethodInvoker) Quay trở lại BeginInvoke đã làm các trick –

0

Nó thực hiện cuộc gọi trên cùng một chuỗi. Bạn có thể kiểm tra bằng cách bước qua mã. Không có gì sai với cách tiếp cận đó.

2

Đối với WinForms, hãy gọi Control.Invoke(Delegate) sẽ gửi thư đến máy bơm thông điệp của máy chủ. Sau đó, luồng xử lý tin nhắn và gọi cho đại biểu. Khi nó đã được xử lý, Invoke sẽ ngừng chặn và quá trình gọi lại tiếp tục chạy mã của bạn.

5

Hãy nhớ rằng Control.InvokeRequired trả về false nếu bạn đang ở trên chủ đề nền AND Control.IsHandleCreated là sai. Tôi sẽ bảo vệ mã bằng một Debug.Assert để kiểm tra việc tạo ra xử lý không được quản lý.

14

Cá nhân tôi thích phương pháp này:

private void ExecuteSecure(Action a) 
{ 
    if (InvokeRequired) 
     BeginInvoke(a); 
    else 
     a(); 
} 

Và sau đó bạn có thể viết một lớp lót như thế này:

ExecuteSecure(() => this.Enabled = true); 
+0

Một cái gì đó không nhìn ngay tại đây.Kích hoạt InvokeRequired trên một điều khiển, bạn chỉ cần đặt nó ra khỏi đó với không có gì. Điều này nghĩa là gì? – Craig

+0

InvokeRequired giống như this.InvokeRequired. –

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