2012-03-03 43 views
42

Không phải của các công việc:Không thể chuyển đổi biểu thức lambda để gõ 'System.Delegate'

_uiDispatcher.Invoke(() => { }); 
_uiDispatcher.Invoke(delegate() { }); 

Tất cả tôi muốn làm là Gọi một phương pháp nội tuyến trên thread UI chính của tôi. Vì vậy, tôi gọi đây là chủ đề chính:

_uiDispatcher = Dispatcher.CurrentDispatcher; 

Và bây giờ tôi muốn thực thi một số mã trên chuỗi đó từ một chuỗi khác. Tôi phải làm nó như thế nào? Tôi có sử dụng sai cú pháp không?

Lưu ý rằng đây là không một ứng dụng WPF; Tôi đã tham chiếu WindowsBase để tôi có thể truy cập vào lớp học Dispatcher.

+0

loại gì là '_uiDispatcher'? Bạn đã sử dụng đối tượng được đồng bộ hóa của giao diện người dùng chưa? – IAbstract

+0

'uiDispatcher' là một thể hiện của http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.aspx. Tôi nghĩ rằng đó là tiềm ẩn từ '_uiDispatcher = Dispatcher.CurrentDispatcher'. "Giao diện người dùng" không có đối tượng được đồng bộ hóa AFAIK .... nhưng tôi sẽ sử dụng nó như thế nào? Điều gì sẽ làm điều đó cho tôi? – mpen

+0

Ah ... ok, tôi không nghĩ rằng bộ điều phối luồng sẽ hoạt động. Đây có phải là ứng dụng WinForm không? – IAbstract

Trả lời

53

Vấn đề là bạn không cung cấp chính xác loại của đại biểu bạn muốn gọi. Dispatcher.Invoke chỉ cần Delegate. Đây có phải là Action<T> không? Nếu vậy, T là gì? Đây có phải là MethodInvoker không? Action? Gì?

Nếu đại biểu của bạn không có đối số và không trả lại gì, bạn có thể sử dụng Action hoặc MethodInvoker. Hãy thử điều này:

_uiDispatcher.Invoke(new Action(() => { })); 
+0

Tôi đoán tôi đã quen với hầu hết các phương pháp chấp nhận một đại biểu cung cấp chữ ký, vì vậy tôi không cần phải chỉ định một. Điều này có ý nghĩa mặc dù. Cảm ơn! – mpen

+1

Tôi không nghĩ rằng điều này hoạt động như thế nào tôi nghĩ rằng nó sẽ. Phương pháp này dường như không bao giờ được gọi; Tôi đoán rằng WPF thường xử lý cho bạn và định kỳ thực hiện các phương pháp đó? Có lẽ tôi nên chỉ là một 'Queue ' và quản lý bản thân mình sau đó ... – mpen

1

Trừ khi tôi đã bỏ lỡ một cái gì đó, tất cả các bạn đã nói với chúng tôi là đây là không phải là một ứng dụng WPF. Tôi không nghĩ Dispatcher là lớp đúng để sử dụng.

Nếu đây là một ứng dụng WinForm, thread UI của bạn có thể được truy cập thông qua WindowsFormsSynchronizationContext

+0

Nó không phải là một ứng dụng WinForm hoặc; Tôi đang sử dụng OpenGL. OpenGL sử dụng ngữ cảnh GL và bạn chỉ có thể vẽ nó từ cùng một chuỗi mà nó được tạo trên đó. Tôi đã cố gắng để tìm ra một cách để chạy một số công cụ trên chủ đề chính ... Tôi đã sử dụng 'Dispatcher' trong một ứng dụng WPF trước đây, vì vậy tôi nghĩ rằng tôi có thể sử dụng nó một lần nữa để giải quyết vấn đề này. – mpen

4
this.Dispatcher.Invoke((Action)(() => { textBox1.Text = "Test 123"; })); 
Các vấn đề liên quan