2013-02-06 28 views
13

Trước đây tôi đãDispatch.Invoke (Hành động mới ...) với một tham số

Dispatcher.Invoke(new Action(() => colorManager.Update())); 

để cập nhật hiển thị để WPF từ thread khác. Do thiết kế, tôi phải thay đổi chương trình và tôi phải chuyển tham số ColorImageFrame vào phương thức ColorStreamManager.Update() của mình.

Sau this liên kết, tôi sửa đổi điều phối của tôi để:

Dispatcher.Invoke(new Action<ColorStreamManager, ColorImageFrame>((p,v) => p.Update(v))); 

Nó biên dịch tốt nhưng sẽ không chạy ở tất cả. VS2010 cho biết "Số tham số không khớp." Trong phương pháp ColorStreamManager.Update() của tôi, tôi có RaisePropertyChanged(() => Bitmap);

Ai đó có thể chỉ ra nơi tôi đã đi sai?

Chữ ký của ColorStreamManager.Update() phương pháp như sau:

public void Update(ColorImageFrame frame); 
+2

Tuyên bố 'ColorStreamManager.Update' trông như thế nào? – Foggzie

+0

Tôi đã cập nhật câu hỏi của mình để trả lời câu hỏi của bạn – ikel

+0

@ikel Chúng tôi không thực sự cần xem toàn bộ chức năng, chỉ là chữ ký của phương thức. – Servy

Trả lời

20

Bạn không muốn hành động có thông số, vì Dispatcher sẽ không biết phải chuyển đến phương thức nào. Thay vào đó, những gì bạn có thể làm gần với biến:

ColorImageFrame someFrame = ...; 
Dispatcher.Invoke(new Action(() => colorManager.Update(someFrame))); 
+0

Ah! _ "đóng biến" _ Tôi cần thông tin đó! – ikel

2

Nếu bạn gọi Invoke với một đại biểu Action<T1, T2>, bạn cần phải vượt qua hai thông số hành động để các cuộc gọi Gọi:

ColorStreamManager colorManager = ... 
ColorImageFrame frame = ... 

Dispatcher.Invoke(
    new Action<ColorStreamManager, ColorImageFrame>((p,v) => p.Update(v)), 
    colorManager, 
    frame); 

Các Gọi quá tải bạn đang sử dụng ở đây là Dispatcher.Invoke(Delegate, Object[]).

+0

Nó dễ dàng hơn và sạch hơn về cú pháp để chỉ đóng các biến thay vì truyền chúng theo cách này. – Servy

+0

Nhưng nó không hoạt động trong mọi trường hợp. Nắm bắt các biến bên ngoài khác với việc chuyển chúng một cách rõ ràng đến Invoke. Xem ví dụ [tại đây] (http://stackoverflow.com/a/271447/1136211). Hơn nữa, OP đã yêu cầu giải pháp này một cách rõ ràng. – Clemens

+0

Điều đó không áp dụng ở đây vì 'Gọi 'là đồng bộ; nó sẽ không trở lại cho đến khi đại biểu được chạy, và nó không bao giờ chạy sau khi phương thức trả về. Bây giờ nếu điều này đã được sử dụng 'BeginInvoke' thì có những vấn đề tiềm ẩn với ngữ nghĩa đóng cửa nếu bạn không cẩn thận. Các vấn đề như vậy có thể * luôn luôn * được giải quyết bằng việc tạo một biến cục bộ mới để tạo một bản sao, nếu cần thiết. Đối với OP yêu cầu, OP yêu cầu làm thế nào để có được đối tượng mà anh ta có đối với phương thức 'Update', anh ta không bao giờ nói rằng các bao đóng không thể được sử dụng. – Servy

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