Bạn có nghĩa là Delegate.Invoke/BeginInvoke hoặc Control.Invoke/BeginInvoke không?
- Delegate.Invoke: Thực hiện đồng bộ, trên cùng một chuỗi.
- Delegate.BeginInvoke: Thực hiện không đồng bộ, trên một chuỗi threadpool.
- Control.Invoke: Thực hiện trên chuỗi giao diện người dùng, nhưng chuỗi cuộc gọi chờ hoàn thành trước khi tiếp tục.
- Control.BeginInvoke: Thực hiện trên chuỗi giao diện người dùng và chuỗi cuộc gọi không chờ hoàn thành.
Câu trả lời của Tim đề cập đến khi nào bạn có thể muốn sử dụng BeginInvoke - mặc dù nó chủ yếu hướng đến Delegate.BeginInvoke, tôi nghi ngờ.
Đối với các ứng dụng Windows Forms, tôi khuyên bạn nên thường là sử dụng BeginInvoke. Bằng cách đó bạn không cần phải lo lắng về bế tắc, ví dụ - nhưng bạn cần phải hiểu rằng giao diện người dùng có thể không được cập nhật vào thời điểm bạn xem xét nó lần sau! Cụ thể, bạn không nên sửa đổi dữ liệu mà chuỗi giao diện người dùng có thể sắp sử dụng cho mục đích hiển thị. Ví dụ: nếu bạn có thuộc tính Person with FirstName và LastName và bạn đã làm:
person.FirstName = "Kevin"; // person is a shared reference
person.LastName = "Spacey";
control.BeginInvoke(UpdateName);
person.FirstName = "Keyser";
person.LastName = "Soze";
thì giao diện người dùng cuối cùng cũng có thể hiển thị "Keyser Spacey". (Có một cơ hội bên ngoài nó có thể hiển thị "Kevin Soze" nhưng chỉ thông qua sự kỳ quặc của mô hình bộ nhớ.)
Trừ khi bạn có loại vấn đề này, tuy nhiên, Control.BeginInvoke dễ dàng hơn để có được, và sẽ tránh chủ đề nền từ phải chờ đợi không có lý do chính đáng. Lưu ý rằng nhóm Windows Forms đã đảm bảo rằng bạn có thể sử dụng Control.BeginInvoke theo cách "lửa và quên" - tức là không bao giờ gọi EndInvoke. Điều này không đúng với các cuộc gọi không đồng bộ nói chung: thông thường mỗi BeginXXX sẽ có một cuộc gọi EndXXX tương ứng, thường là trong cuộc gọi lại.
Nguồn
2008-10-23 12:40:02
Sau đó, tại sao ppl sử dụng Gọi trên BeingInvoke? Không nên có một số lợi thế hơn khi sử dụng Invoke. Cả hai thực thi các quy trình trong nền, chỉ một trong đó là trên cùng một sợi, cái kia trên các luồng khác nhau? – yeeen
@Jon: Trong khi tôi đang sử dụng Dispatcher.BeginInvoke mã của tôi là làm việc tốt và trong Dispatcher.Invoke ứng dụng của tôi làm cho tôi chờ vài giây sau đó nó khởi tạo tất cả các điều khiển sau đó tung ra, Bạn có thể vui lòng giúp tôi để tìm hiểu chính xác ở nơi tôi bị mắc kẹt ? – SharpUrBrain
@All: Ai có thể đưa ra ý tưởng ngắn gọn về Dispatcher.BeginInvoke và Dispatcher.Invoke không? Cách họ làm việc và những gì họ làm, mọi thứ. – SharpUrBrain