2010-06-24 43 views
5

Câu hỏi thay thế: Tại sao VS10 lại muốn khiếu nại về Invoke?Lắp ráp C# nào chứa Invoke?

Trong việc tìm kiếm tiếp tục của tôi để làm cho công việc ứng dụng của tôi trở thành thế giới tốt nhất C# lập trình viên, tôi đã quyết định rằng chủ đề là một Thing Tốt ™.

MSDN có một bài viết hữu ích về việc tạo thread-safe calls to controls, nhưng nó (và dường như mọi bài viết khác về chủ đề) tham chiếu chéo một phương thức gọi là Gọi. Đôi khi thậm chí BeginInvoke, mà I've read is to be preferred.

Tất cả điều này sẽ rất tuyệt, nếu tôi có thể sử dụng studio trực quan để nhận ra Invoke. MSDN nói rằng it is contained in the System.Windows.Forms assembly, nhưng tôi đã 'sử dụng' điều đó. Để chắc chắn, tôi cũng đã thử sử dụng System.Threading, nhưng không có kết quả.

Tôi cần phải làm gì để nhảy qua để yêu cầu làm việc?

+0

Ý bạn là gì bởi "Visual Studio nhận ra Gọi"? Intellisense? –

+0

Bạn đang nói về việc gọi một phương thức trên một điều khiển đã được tạo ra trên một luồng khác thì chuỗi hiện đang thực hiện? –

+1

+1 cho hài hước ... –

Trả lời

4

Invoke nằm trong tầm kiểm soát. I E. Control.Invoke();

Không có cách nào gọi trực tiếp Gọi trực tiếp vì không có phương thức như vậy trong System.Windows.Forms. Phương thức Invoke là một thành viên điều khiển.

Dưới đây là một example tôi đã thực hiện trước đó:

public delegate void AddListViewItemCallBack(ListView control, ListViewItem item); 
public static void AddListViewItem(ListView control, ListViewItem item) 
{ 
    if (control.InvokeRequired) 
    { 
     AddListViewItemCallBack d = new AddListViewItemCallBack(AddListViewItem); 
     control.Invoke(d, new object[] { control, item }); 
    } 
    else 
    { 
     control.Items.Add(item); 
    } 
} 
2

Bạn cần phải gọi Invoke trên một dụ của một cái gì đó mà chứa nó - nếu bạn đang dùng Windows Forms, đó sẽ là một điều khiển:

control.Invoke(someDelegate); 

hoặc cho mã trong một hình thức, bạn có thể sử dụng tài liệu tham khảo this tiềm ẩn:

Invoke(someDelegate); 

Bạn không cần phải trải qua bất kỳ vòng lặp cụ thể nào. Nếu Visual Studio đang phàn nàn, vui lòng chỉ rõ lỗi trình biên dịch và mã mà nó phàn nàn. Không có gì đặc biệt về số Invoke tại đây.

2

Biểu tượng thắng là Invoke là phương pháp thể hiện Control - bạn chỉ cần một phiên bản kiểm soát (có thể là this trong nhiều trường hợp). Ví dụ:

txtBox.Invoke(...); 

Nó cũng có thể được truy cập thông qua một giao diện, hoặc đồng bộ ngữ cảnh nếu bạn muốn trừu tượng - nhưng cách tiếp cận đơn giản nhất là để xử lý nó ở giao diện người dùng thông qua một sự kiện, trong đó trường hợp điều khiển là thuận tiện sẵn .

0

Gọi là một phương pháp trên các đối tượng, thường được tìm thấy trên các Điều khiển trong thư viện Biểu mẫu và một số lớp không đồng bộ. Tất nhiên, bạn cần các đối tượng cụ thể để có thể gọi Invoke theo số điều khiển/lớp học đó là.

1

Nếu bạn thực sự muốn trở thành thế giới tốt nhất C# lập trình viên, bạn phải biết rằng đề không phải là một điều tốt nếu sử dụng đúng cách.

Cập nhật giao diện người dùng trên các chuỗi thường là dấu hiệu cho thấy bạn đang lạm dụng chủ đề.

Dù sao, nó không đủ để sử dụng using System.Windows.Forms, bạn phải thêm nó vào tài liệu tham khảo. Thực hiện một nhấp chuột phải vào References trong thám hiểm dự án của bạn, sau đó Thêm Tài liệu tham khảo và chọnSystem.Windows.Forms

+0

Cảm ơn! Bạn đã đi và làm đi làm tôi bối rối. (Đây là một câu hỏi khác mà bạn có thể muốn trả lời: http://stackoverflow.com/questions/3110154/why-is-the-explicit-management-of-threads-a-bad-thing) –

+0

"Cập nhật giao diện người dùng trên các chủ đề là thường là dấu hiệu cho thấy bạn đang lạm dụng các chủ đề. " Wow, đó là một cái mới cho tôi. Vì vậy, nếu tôi đặt hoạt động phân tích dài trong chuỗi BG để giữ giao diện người dùng phản hồi, nhưng người dùng muốn xem kết quả gia tăng một cách nhanh chóng, do đó, chuỗi BG của tôi định kỳ đăng kết quả về chủ đề giao diện người dùng, đây có phải là lạm dụng không? Và bây giờ bạn sẽ tiết lộ giải pháp tốt hơn? –

+2

Vâng, nó khá đơn giản: Sử dụng các sự kiện. BG Thread cung cấp một sự kiện mà UI có thể đăng ký, tức là "FileCopied", "NumberCalculated", vv UI có thể đăng ký nó và nhân viên nền sẽ vẫn làm việc mà không sửa đổi nếu bạn chuyển mã của bạn từ winform sang WPF, thực hiện giao diện người dùng đa ngôn ngữ, thay đổi hộp thoại nhàm chán thành một hộp thoại ưa thích, v.v. – dbemerlin

0

Bạn đang có lẽ cố gắng gọi Invoke từ bên trong một lớp học (ví dụ: không từ bên trong một Form hoặc một Control). Di chuyển mã của bạn ra khỏi lớp và vào biểu mẫu hoặc kiểm soát và bạn sẽ thấy rằng biên dịch Invoke hoạt động chính xác (nói đúng, mã của bạn nên tham chiếu this.Invoke, làm cho nguồn của phương thức rõ ràng, nhưng Invoke cũng sẽ hoạt động nó giả định this).

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