好文,转自:http://www.cnblogs.com/csMapx/archive/2011/06/20/2084647.html
现在C#已经建议摈弃使用 Suspend, Resume 暂停/恢复线程, 也尽量少用 Abort方法中断一个线程.
建议使用线程的同步手段有: Mutex、ManualResetEvent、AutoResetEvent, Monitor.
下面再对此进行详细描述.
Thread类的构造函数有2类:
一种是不带参数(ThreadStart 委托) --
public Thread(ThreadStart start);
另一种是带参数(ParameterizedThreadStart 委托) --
public Thread(ParameterizedThreadStart start);
ParameterizedThreadStart 委托签名:
public delegate void ParameterizedThreadStart(Object obj);
示例:
1. 不带参数:
// 定义线程方法:
private static void ThreadMain()
{
Console.WriteLine("This is other thread main method.");
}
// 调用:
Thread mythread = new Thread(ThreadMain);
mythread.Start();
2. 带参数:
// 定义线程方法:
private static void MainThreadWithParameters(object o)
{
Data d = (Data)o; //类型转换
Console.WriteLine("Running in a thread, received {0}", d.Message);
}
public struct Data
{
public string Message;
}
// 调用:
var data = new Data { Message = "Info" };
Thread t2 = new Thread(MainThreadWithParameters);
t2.Start(data); // 传入参数
3. 通过定义类传递参数:
// 定义存放数据和线程方法的类:
public class MyThread
{
private string message;
public MyThread(string data)
{
this.message = data;
}
public void ThreadMethod()
{
Console.WriteLine("Running in a thread, data: {0}", this.message);
}
}
// 调用
var obj = new MyThread("info");
Thread myThread = new Thread(obj.ThreadMethod); //ThreadStart 委托
mythread.Start();
public void start_delegate(object data){
string str = (string)data; // 这里实际上存在一个拆箱的操作啊!
Console.WriteLine("start a new thread and name is {0}",data);
Console.ReadKey();
}
static public void func_thread(){
Console.WriteLine("this is a no paramenter thread");
}
static void Main(string[] args) {
// one
Thread thread = new Thread(func_thread);
thread.Start();
// two
ConsoleApplication3.Program TEMP = new ConsoleApplication3.Program();
Thread new_thread = new Thread(TEMP.start_delegate);
new_thread.Name = "new_thread";
new_thread.Start(new_thread.Name);
// three
myclass my_class = new myclass("hello it is me");
Thread my_thread = new Thread(my_class.method); // 该方法不能包含参数
my_thread.Start();
}
创建的类
string data = string.Empty;
public myclass(string str) {
data = str;
}
public void method() {
Console.WriteLine("the data is {0}", data);
}