Chỉnh sửa: Có vẻ như tôi phải lấy lại những gì tôi đã viết trước đây. Thử như sau:
Added một textbox gọi myTextBox
và cố gắng để lấy giá trị của tài sản Text
:
Thread t = new Thread(
o =>
{
Thread.Sleep(2000);
string value = myTextBox.Text;
Thread.Sleep(2000);
});
t.Start();
Và có vẻ như ứng dụng (WPF) bị treo sau 2 giây. Sử dụng điều phối hoạt động:
Thread t = new Thread(
o =>
{
Thread.Sleep(2000);
myTextBox.Dispatcher.BeginInvoke(
(Action)(() => { string value = myTextBox.Text; }));
Thread.Sleep(2000);
});
t.Start();
Vì vậy, bạn vẫn cần phải đi qua thread dispatcher khi đọc giá trị từ các thành phần GUI, ít nhất là trong WPF.
Chỉnh sửa thứ hai: Điều này trở nên tốt hơn. Dường như lặp lại thí nghiệm cho WinForms cổ điển cho thấy nó hoạt động để đọc tài sản Text
mà không cần sử dụng Invoke/BeginInvoke
. Điều thú vị đủ, có vẻ như cũng thiết lập các tài sản hoạt động tốt (không gọi), mặc dù tôi sẽ cược nó không phải là chủ đề an toàn và các ứng dụng không phàn nàn vì lý do nào.
Dòng dưới cùng: Bạn nên sử dụng bộ điều phối khi tương tác với các thành phần GUI từ các chủ đề khác, vì nó đảm bảo đọc/ghi được tuần tự hóa thành một chuỗi đơn và do đó bạn không có chủ đề an toàn vấn đề.
bạn có thể sử dụng đại biểu để làm điều đó – jorne
@CodeCaster Chỉ cần thử và xem những gì hoạt động thường không giúp bạn có được mã an toàn chỉ. – hvd
@hvd: Nhưng nó đáp ứng tất cả các câu hỏi đặt ra _here_. –