一、属性 CurrentContext 获取线程正在其中执行的当前上下文。ExecutionContext 获
Thread 类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数。
ThreadStart委托定义了一个返回类型为void的无参数方法。在创建了 Thread对象后,就可以用Start()方法启动线程:
class Program
{
static void Main()
{
var t1 = new Thread(ThreadMain);
t1.Start();
Console.WriteLine("This is the main thread.");
}
static void ThreadMain()
{
Console.WriteLine("Running in a thread.");
}
}
Lambda表达式还可以与Thread类一起 使用,将线程方法的实现代码传送给Thread构造函数的实参:
static void Main()
{
var t1 = new Thread(() => Console.WriteLine("running in a thread, id: {0}",Thread.CurrentThread.ManagedThreadId));
t1.Start();
Console.WriteLine("This is the main thread, id: {0}",
Thread.CurrentThread.ManagedThreadId);
}
给线程传递一些数据可以采用两种方式。
要给线程传递数据,需要某个存储数据的类或结构。这里定义了包含字符串的Data结构,但可以传递任意对象.
static void Main()
{
var d = new Data { Message = "Info" };
var t2 = new Thread(ThreadMainWithParameters);//ParameterizedThreadStart委托实例
t2.Start(d);
}
static void ThreadMainWithParameters(object o)//如果使用了 ParameterizedThreadStart委托,线程的入口点必须有一个object类型的参数,且返回类型为void。
{
Data d = (Data)o;
Console.WriteLine("Running in a thread, received {0}", d.Message);
}
public struct Data
{
public string Message;
}
给新线程传递数据的另一种方式是定义一个类(参见MyThread类),在其中定义需要的字段,将线程的调用的方法定义为类的一个实例方法:
static void Main()
{
var obj = new MyThread("info");
var t3 = new Thread(obj.ThreadMain);//实例方法
t3.Start();
}
//实例方法
public class MyThread
{
private string data;
public MyThread(string data)
{
this.data = data;
}
public void ThreadMain()
{
Console.WriteLine("Running in a thread, data: {0}", data);
}
}
只要有一个前台线程在运行,应用程序的进程就在运行。
如果多个前台线程在运行,而Main()方法结束了,应用程序的进程就仍然是激活的,直到所有前台线程完成其任务为止。
在默认情况下,用Thread类创建的线程是前台线程。线程池屮的线程总是后台线程。
在用Thread类创建线程时,可以设置IsBackground属性,以确定该线程是前台线程还是后台线程。
在Thread类中,可以设置Priority属性,以影响线程的基本优先级。Priority属性需要ThreadPriority 枚举定义的一个值。定义的级别有Highest、AboveNomal、BelowNORMal和Lowest。
public class Worker
{
// 此方法将在线程启动时调用。
public void DoWork()
{
while (!_shouldStop)
{
Console.WriteLine("工作线程: working...");
}
Console.WriteLine("工作线程:正常停止");
}
public void RequestStop()
{
_shouldStop = true;
}
// Volatile用于提示编译器这个数据成员将被多个线程访问。
private volatile bool _shouldStop;
}
static void Main()
{
// 创建thread对象,但这不会启动线程。
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork);
// 启动工作线程。
workerThread.Start();
Console.WriteLine("main thread: 启动工作线程...");
// 循环,直到工作线程激活。
while (!workerThread.IsAlive) ;
// 将主线程休眠1毫秒,让工作线程做一些工作:
Thread.Sleep(1);
// 请求工作线程停止自身:
workerObject.RequestStop();//workerObject.Abort()
//使用Join方法阻塞当前线程,直到工作线程执行完毕才往下执行
workerThread.Join();
Console.WriteLine("main thread: 工作线程已经终止.");
}
//定义一个委托实现回调函数
public delegate void CallBackDelegate(string message);
void Main()
{
//委托实现方法和定义线程
CallBackDelegate cbd = CallBack;
Thread thread = new Thread(initFtpParam);
thread.Start(cbd);
}
/// <summary>
/// 线程方法
/// </summary>
/// <param name="obj"></param>
public void initFtpParam(object obj)
{
CallBackDelegate callBackDelegate = obj as CallBackDelegate;
callBackDelegate("aa");//执行委托
}
/// <summary>
/// 回调方法
/// </summary>
/// <param name="message"></param>
private void CallBack(string message)
{
Console.Write(message);
}
1、.net4.5之前,只能用以下代码只能针对单个线程,如果每次执行线程 都要重新设置一下。。。
新开一个新线程,默认的CurrentCulture为系统的Culture,如果要改变当前线程的Culture,需要在线程中修改 Thread.CurrentCulture值来实现。
m.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
2、如果使用的.net环境是4.5及以上版本,CultureInfo提供了两个静态属性DefaultThreadCulture和DefaultThreadUICulture,一处修改即可实现所有的未显式设置Thread.CurrentCulture的线程都使用这个Default值。
System.Globalization.CultureInfo.DefaultThreadCurrentCulture = new System.Globalization.CultureInfo("en-US");
System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = new System.Globalization.CultureInfo("en-US");
到此这篇关于C#线程开发之System.Thread类的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。
--结束END--
本文标题: C#线程开发之System.Thread类详解
本文链接: https://lsjlt.com/news/148494.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0