Đôi khi bạn cần xử lý 1 công việc nào đó được lập đi lại nhiều lần trong 1 thời điểm, hoặc cùng 1 lúc bạn thực hiện nhiều công việc thì bạn hãy nghĩ đến Thread
Ta có 1 ví dụ cơ bản về thread trên Console như sau:
using System;using System.Threading;public class Test{ static void Main() { ThreadStart job = new ThreadStart(ThreadJob); Thread thread = new Thread(job); thread.Start(); for (int i = 0; i < 5; i++) { Console.WriteLine("Main thread: ", i); Thread.Sleep(1000); } Console.ReadLine(); } static void ThreadJob() { for (int i = 0; i < 10; i++) { Console.WriteLine("Other thread: ", i); Thread.Sleep(500); } }} |

Như các bạn đã thấy ngoài luồng dữ liệu chính tạo ra, System.Threading.Thread còn tạo ra cho ta 1 luồng dữ liệu mới để thực hiện hàm ThreadJob()
Như vậy nếu bạn có 5 users, bạn muốn cho 5 users này cùng 1 lúc thì sao?
using System;using System.Threading;public class Test{ static void Main() { for (int i = 1; i <= 5; i++) { Users user = new Users(i); new Thread(new ThreadStart(user.Download)).Start(); } Console.ReadLine(); } public class Users { private int number; public Users(int number) { this.number = number; } public void Download() { for (int i = 1; i <= 3; i++) { Console.WriteLine("User is ing file ",this.number, i); Thread.Sleep(1000); } } }} |

Nhưng khi bạn sử dụng Thread với giao diện UI, Control (Xử lý với Control trong hàm thực thi thread) thì thường xảy ra cảnh báo exception: "Cross thread operation is not valid..."
Vậy để khắc phục cảnh báo gây ra liên quan đến Control đơn giản nhất là đặt thuộc tính tĩnh:
CheckForIllegalCrossThreadCalls = false |
Ví dụ tôi có 1 Textbox và 2 hàm thực hiện chèn thêm vào textbox các dòng lần lượt:
- This is Thread 1
- This is Thread 2

Nếu các bạn viết như sau sẽ có thể gây ra lỗi "Cross thread operation is not valid..."
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Threading;namespace WindowsApplication2{ public partial class Form1 : Form { Thread t1, t2; public Form1() { InitializeComponent(); } private void AppendText(string s) { textBox1.AppendText(s); textBox1.AppendText(Environment.NewLine); } private void Thread1() { while (true) { AppendText("This is thread 1"); Thread.Sleep(500); } } private void Thread2() { while (true) { AppendText("This is thread 2"); Thread.Sleep(500); } } private void Form1_Load(object sender, EventArgs e) { t1 = new Thread(Thread1); t2 = new Thread(Thread2); t1.Start(); t2.Start(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { t1.Abort(); t2.Abort(); } }} |
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Threading;namespace WindowsApplication2{ public partial class Form1 : Form { Thread t1, t2; public Form1() { InitializeComponent(); } private void AppendText(string s) { if (textBox1.InvokeRequired) { textBox1.BeginInvoke(new MethodInvoker(delegate() { AppendText(s); })); } else { lock (textBox1) { textBox1.AppendText(s); textBox1.AppendText(Environment.NewLine); } } } private void Thread1() { while (true) { AppendText("This is thread 1"); Thread.Sleep(500); } } private void Thread2() { while (true) { AppendText("This is thread 2"); Thread.Sleep(500); } } private void Form1_Load(object sender, EventArgs e) { t1 = new Thread(Thread1); t2 = new Thread(Thread2); t1.Start(); t2.Start(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { t1.Abort(); t2.Abort(); } }} |
