Property ThreadState và ThreadPriority
ThreadState
Thuộc tính ThreadState cho thấy trạng thái hiện tại của thread. Mỗi một lời gọi phương thức của thread sẽ làm thay đổi giá trị thuộc tính này như Unstarted, Running, Suspended, Stopped, Aborted,….
ThreadPriority
Thuộc tính này xác định mức độ ưu tiên mà thread sẽ được thực thi so với các thread khác. Mỗi thread khi được tạo ra mang giá trị priority là Normal. Các giá trị mà thuộc tính có thể có bao gồm: Lowest, BelowNormal, Normal, AboveNormal và Highest.
Các phương thức thông dụng của Thread
– Abort(): khi phương thức này được gọi, hệ thống sẽ ném ra một ngoại lệThreadAbortException để kết thúc thread. Sau khi gọi phương thức này, thuộc tính ThreadState sẽ chuyển sang giá trị Stopped.
– Suspend(): phương thức này sẽ tạm dừng việc thực thi của Thread vô thời hạn cho đến khi nó được yêu cầu chạy tiếp tục với phương thức Resume(). Tuy nhiên hai phương thức này được gắn attribute Obsolete để khuyến cáo rằng bạn nên sử dụng những phương pháp khác để thay thế. Các kĩ thuật này sẽ được giới thiệu trong một bài khác.
– Sleep(): để dừng thread hiện tại trong một khoảng thời gian tính bằng milisecond, khi đó thread sẽ chuyển sang trạng thái WaitSleepJoin. Chú ý rằng đây là một phương thức static và bạn không cần tạo đối tượng Thread khi gọi nó, ví dụ: Thread.Sleep(1000). Tôi nhấn mạnh chữ hiện tại tức là tùy vào vị trí mà bạn gọi Thread.Sleep(), mà Thread thực thi dòng lệnh này sẽ bị ảnh hưởng. Nếu như bạn không tạo thêm Thread thì Thread đang thực thi chương trình sẽ bị ảnh hưởng (chương trình sẽ tạm ngừng hoạt động).
Tạo đối tượng Thread và truyền một delegate ThreadStart chứa phương thức sẽ thực thi vào constructor của Thread.
C# 2016
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
//Tạo đối tượng ThreadStart bao lấy phương thức tĩnh(nó chỉ có thể bao lấy phương thức k tham số)
//Tạo luồng Thread bao lấy ThreadStart
Thread t = new Thread(new ThreadStart(MethodA));
t.Start();
MethodB();
Console.Read();
}
static void MethodA()
{
for (int i = 0; i < 50; i++)
{
Console.Write("0");
}
}
static void MethodB() //Đây là phương tĩnh, không tham số
{
for (int i = 0; i < 50; i++)
{
Console.Write("1");
}
}
}
}
Nếu bạn không dùng thread chạy lần lượt 2 phương thức MethodA() và MethodB() thì kết quả in ra sẽ là 100 kí tự ‘0’ và sau đó là 100 kí tự ‘1’.
Truyền tham số cho Thread
C# 2016
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace Demo { class Student { public string Name { set; get; } public int Age { set; get; } } class Program { static void Main(string[] args) { Thread t = new Thread(Display); t.Start(new Student() { Name = "Admin", Age = 33}); Console.Read(); } static void Display(object o) { Student s = (Student)o; Console.Write(s.Name+" "+s.Age); } } }
Output: Admin 33
Sử dụng phương thức không tĩnh và sử dụng Thread.Sleep()
C# 2016
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace Demo { class Worker { public string Name; public int Loop; public Worker(string name, int loop){ Name = name; Loop = loop; } public void DoWork() //Đây là phương thức không tĩnh, không tham số { for(int i =0; i< Loop; i++){ Console.WriteLine(Name +" Work "+Loop); Thread.Sleep(50); } } } class Program { static void Main(string[] args) { Worker w1 = new Worker("Admin",10); Thread t1 = new Thread(w1.DoWork); t1.Start(); Worker w2 = new Worker("\t\tSale", 10); Thread t2 = new Thread(w2.DoWork); t2.Start(); Console.Read(); } } }
Ví dự đơn giản dễ hiểu hơn về Sleep()
C# 2016
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace Demo { class Program { static void Main(string[] args) { Thread t = new Thread(MethodA); t.Start(); MethodB(); Console.Read(); } static void MethodA() //Đây là một phương thức tĩnh, không tham số { Thread.Sleep(500); for (int i = 0; i < 100; i++ ) { Console.Write("-0-"); } } static void MethodB() { for (int i = 0; i < 100;i++ ) { Console.Write("1"); } } } }
ThreadStart
C# 2016
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace Demo { class Program { //Khai báo biến và tạo constructor có tham số private string Name; public Program(string name) { Name = name; } //Đây là phương thức không tĩnh, không tham số public void DoCode() { for (int i = 0; i < 5;i++ ) { Console.WriteLine(Name+" conffing..."); Thread.Sleep(50); } Console.Read(); } //Đây là phương thức tĩnh, không tham số public static void DoWork(){ for (int i = 0; i < 10;i++ ) { Console.WriteLine("*"); Thread.Sleep(100); } Console.Read(); } static void Main(string[] args) { //Vì DoWork là tĩnh nên không cần tạo đối tượng Program để gọi nó //Tạo đối tượng ThreadStart bao lấy phương thức tĩnh DoWork không tham số ThreadStart ts1 = new ThreadStart(DoWork); //Tạo đối tượng Thread bao lấy đối tượng Thread Thread t1 = new Thread(ts1); //Gọi start thread t1.Start(); //DoCode là không tĩnh nên cần tạo đối tượng Program để gọi nó Program p = new Program("Admin"); //Tạo đối tượng ThreadStart bao lấy phương thức không tĩnh DoCode ThreadStart ts2 = new ThreadStart(p.DoCode); //Tạo đối tượng Thread bao lấy ThreadStart Thread t2 = new Thread(ts2); //Gọi start thread t2.Start(); } } }
Thread - Delegate Hàm không có tên có tham số và không tham số
Delegate C# 2016
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace Demo { class Program { static void Main(string[] args) { //Creat thread thực thi đoạn code Thread t1 = new Thread( delegate() //Delegate hàm không có tên { for (int i = 0; i < 10; i++) { Console.WriteLine("ThreadStart A " + i); Thread.Sleep(100); } } ); //Bắt đầu thread call thread t1.Start(); //Creat thread thực thi đoạn code Thread t2 = new Thread( delegate(object value) //Delegate hàm không có tên nhưng có tham số { for (int i = 0; i < 10; i++) { Console.WriteLine("\t\t\t ThreadStart B {0} - {1}",i,value); Thread.Sleep(100); } } ); //Bắt đầu thread call thread t2.Start("Text"); Console.Read(); } } }
Đặt tên cho Thread (CurrentThread.Name)
CurrentThread.Name C# 2016
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Threading;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
//Đặt tên cho luông chính
Thread.CurrentThread.Name = "Main 01";
Console.WriteLine("Name thread: "+Thread.CurrentThread.Name);
//Tạo một luồng bao lấy phương thức tĩnh
Thread thread = new Thread(display);
thread.Name = "\t\tMain 02";
thread.Start();
for (int i = 0; i < 10; i++)
{
Console.WriteLine("\tName: " + Thread.CurrentThread.Name);
Thread.Sleep(60);
}
Console.Read();
}
//Phương thức tĩnh không tham số
public static void display()
{
for (int i = 0; i < 10;i++ )
{
Console.WriteLine("\tName: " + Thread.CurrentThread.Name);
Thread.Sleep(100);
}
}
}
}
0 nhận xét:
Post a Comment