Biên tập: thienthanit@yahoo.com Nguồn: Internet Nếu bạn áp đặt đa luồng vào trong ứng dụng đa luồng, giả sử bạn muốn nhận một hay nhiều giá trị được trả về thì phải làm thế nào. Với ThreadStart thì chắc chắn là không thể, với lý do tham số của ThreadStart phải là phương thức (hàm) không có giá trị trả về Dưới đây là một ví dụ sử dụng delegate một cách trực tiếp, bạn có thể làm mọi thứ ở trong này (không biết là có đúng không, vì chưa bị teo bao giờ :D) private int DoSomething() { return 5; } int x = 0; // biến sẽ lưu giá trị trả về private void DoSomething_Click(object sender, EventArgs e) { Thread t= new Thread(delegate() { x = DoSomething(); }); t.Start(); t.Join(); // Chờ thread làm xong thì đồng bộ với luồng chính tbResult.Text = x.ToString(); } } Phiên bản Console: class Program { private static int DoSomething() { return 5; } static int x = 0; [STAThread] static void Main(string[] args) { Console.WriteLine(x.ToString()); Thread t= new Thread(delegate() { x = DoSomething(); }); t.Start(); t.Join(); // Chờ thread thực hiện xong công việc rồi đồng bộ Console.WriteLine(x.ToString()); Console.Read(); } } Biên tập: thienthanit@yahoo.com Nguồn: Internet Giả sử bản thân Thread t trong phiên bản winform có tác động làm, hay đang cố thay đổi một thuộc tính nào đó trong Form đã gọi nó, thì bạn cần phải chú ý các thao tác đồng bộ với nó. Bằng phương thức BeginInvoke() của Form. Nếu không, nó có thể báo lỗi . một hay nhiều giá trị được trả về thì phải làm thế nào. Với ThreadStart thì chắc chắn là không thể, với lý do tham số của ThreadStart phải là phương thức (hàm) không có giá trị trả về Dưới đây. sẽ lưu giá trị trả về private void DoSomething_Click(object sender, EventArgs e) { Thread t= new Thread( delegate() { x = DoSomething(); }); t.Start(); t.Join(); // Chờ thread. [STAThread] static void Main(string[] args) { Console.WriteLine(x.ToString()); Thread t= new Thread( delegate() { x = DoSomething(); }); t.Start(); t.Join(); // Chờ thread