30/09/2018, 22:30

[WPF] đoạn thread này sai ở đâu?

Theo khái niệm mà e nắm bắt được thì thread là thực hiện nhiều công việc trong cùng 1 lúc.
vậy bác nào giải ngố giúp e đoạn này sao nó ko hoạt động

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Thread a = new Thread(() => {
                textBox.Text = "text";
            });
            a.Start();
        }
    }


Thread a = new Thread(new ThreadStart(MethodA)); a.Start(); MethodB();
với
Thread a = new Thread(new ThreadStart(MethodA)); a.Start(); Thread b = new Thread(new ThreadStart(MethodB)); b.Start();
khác nhau như thế nào ???

Quân viết 00:33 ngày 01/10/2018
  1. Sở dĩ không hoạt động là do bạn đang thực hiện thay đổi UI trên thread khác thread main.
  2. 2 cách khai báo không khác nhau về ý nghĩa lắm, cách 1 là shorthand giúp code gọn hơn
Văn Dương viết 00:37 ngày 01/10/2018
  • Thread không nên hiểu như vậy. Thread có thể hiểu là tiểu trình. Sử dụng nó mục đích là tạo ra nhiều luồng xử lý hoạt động độc lập. Nên nó có thể thực hiện nhiều việc đồng thời và độc lập nhau.
  • Đoạn code không chạy do nó dùng tới dữ liệu của đối tượng trên thread khác (ross-thread)( textbox 1 là đối tượng thuộc thead khác với thread mới tạo). Theo quy tắc thì không được phép dùng trực tiếp dữ liệu của đối tượng trên Thread khác như vậy. Trong WPF phải thông qua dispatcher.
  • Đoạn code 1 là đẩy methodA sang một thread mới xử lý và tiếp tục xử lý methodB trên thread hiện tại. Đoạn code 2 là đưa 2 method ra 2 thread khác nhau xử lý.
hdt viết 00:43 ngày 01/10/2018

vậy nếu ko sử dụng dữ liệu của thread khác, thì m phải đưa cả method vào hả bác? Kể cả method của đối tượng khác?

Văn Dương viết 00:35 ngày 01/10/2018

vậy nếu ko sử dụng dữ liệu của thread khác, thì m phải đưa cả method vào hả bác? Kể cả method của đối tượng khác?

Hình như bạn đang có hiểu nhầm gì ở đây ? Không hiểu ý bạn muốn hỏi gì nhưng giải thích them tý ở dưới
Một Thread sẽ được tạo ra từ Thread khác ( trừ Thread Main) và đương nhiên nó sẽ có lien quan về dữ lieu với các Thread khác. Ví dụ nó sẽ sử dung chung dữ lieu với Thread tạo ra nó hoặc với các Thread khác.

Nếu dữ lieu / đối tượng mà nó dung của Thread khác không phải/ kế thừa DependencyProperty (tài sản phụ thuộc - điển hình là các thuộc tính của Control đều là DependencyProperty) hoặc kế thừa DependencyObject(ví dụ WriteableBitmap) thì sẽ không có Cross-Thread xảy ra. Lúc ấy ta chỉ cần lưu tâm đến việc sử dung sao cho không xảy ra deadlock.

Còn trường hợp sử dung dữ lieu/đối tượng của Thread khác mà nó là DependencyProperty hoặc DependenObject thì sẽ có Cross-Thread. Khi đó phải sử dung Dispatcher để có thể truy cập đến các dữ lieu/đối tượng này.

(Mình không đưa code ví dụ vì nó dài )

Bài liên quan
0