2010-01-31 16 views
10

Tôi cần trợ giúp thiết lập/thay đổi giá trị của nhãn trong chương trình C# của tôi bất cứ khi nào tôi thử lỗi xảy ra nói rằng tôi cần phải vượt qua tất cả. Bất cứ ai có thể viết một số mã để giúp tôi với điều đó? Mã của tôi là:Đặt giá trị của nhãn bằng C# Cross Threading

int number = 0; 
int repeats = Convert.ToInt32(textBox2.Text); 

while (number < repeats) 
{ 
    repeats++; 
    label5.Text = "Requested" + repeats + "Times"; 
} 

Mọi người có thể giúp tôi không? Cảm ơn.

+0

Tôi cho rằng bạn có nghĩa là bạn đang bị loại trừ vì bạn cố đặt thuộc tính Văn bản nhãn từ một chuỗi khác? – zebrabox

+0

Yeah :(Nó được sắp xếp khá nhiều bây giờ – Lawrence

Trả lời

30

Thử cách sau để cập nhật giá trị

label5.Invoke((MethodInvoker)(() => label5.Text = "Requested" + repeats + "Times")); 

Các phương thức Invoke (từ Control.Invoke) sẽ gây ra thông qua tại đại biểu được chạy trên thread đó cho Control được affinitized tới. Trong trường hợp này nó sẽ làm cho nó chạy trên luồng GUI của ứng dụng của bạn và do đó làm cho bản cập nhật an toàn.

+0

Cảm ơn rất nhiều :) Làm việc một điều trị! – Lawrence

9

Bạn có thể thêm phương pháp này mở rộng mà tôi thường xuyên sử dụng (tương tự như trong kỹ thuật để trả lời @ JaredPar của):

/// <summary> 
    /// Extension method that allows for automatic anonymous method invocation. 
    /// </summary> 
    public static void Invoke(this Control c, MethodInvoker mi) 
    { 
    c.Invoke(mi); 

    return; 
    } 

Sau đó bạn có thể sử dụng trên bất kỳ Control (hoặc các dẫn xuất) natively trong mã của bạn qua:

// "this" is any control (commonly the form itself in my apps) 
this.Invoke(() => label.Text = "Some Text"); 

Bạn cũng có thể thực hiện nhiều phương pháp thông qua phương pháp vô danh qua:

this.Invoke 
(
    () => 
    { 
     // all processed in a single call to the UI thread 
     label.Text = "Some Text"; 
     progressBar.Value = 5; 
    } 
); 

Ghi nhớ rằng nếu các luồng của bạn đang cố gắng Gọi trên một điều khiển được xử lý, bạn sẽ nhận được một ObjectExposedException. Điều này xảy ra nếu một chủ đề chưa bị hủy bỏ bởi ứng dụng đang tắt. Bạn có thể "ăn" ObjectDisposedException bằng cách gọi Invoke() xung quanh, hoặc bạn có thể "ăn" ngoại lệ trong phần mở rộng phương thức Invoke().

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