这篇文章主要介绍了C# 中使用 Thread的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
线程是进程中的最小执行单元,多线程是指在给定时间内拥有多个线程的能力,并且可以调度它们从而在某一时刻处理多个操作,微软的 .Net Framework
提供了 Thread 来帮助我们完成多线程开发。
Thread 编程
要想使用 Thread,需要在程序中引用 System.Threading 命名空间,然后再提供一个供线程调度的方法,这个方法是通过 Thread 中的 ThreadStart 委托代理的,下面的代码展示了如何创建线程。
Thread t = new Thread(new ThreadStart(MyThreadMethod));
线程创建好之后,还需要调用 Start 方法去启动,下面的代码展示了如何去实现,哦,对了,上面的 MyThreadMethod
方法会在新的线程上被调度,而不是调用线程。
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(new ThreadStart(MyThreadMethod));
t.Start();
Console.Read();
}
static void MyThreadMethod()
{
Console.WriteLine("Hello World!");
}
}
展示线程状态
一个创建好的线程,它的生命周期内会有多个状态,比如:Aborted, Background, Running, Stopped, Suspended, Unstarted 等等,这些状态在 Thread 中是用 ThreadState
枚举表示的,如下代码所示:
[Flags]
public enum ThreadState
{
Running = 0,
StopRequested = 1,
SuspendRequested = 2,
Background = 4,
Unstarted = 8,
Stopped = 16,
WaitSleepJoin = 32,
Suspended = 64,
AbortRequested = 128,
Aborted = 256
}
当一个 Thread 对象创建好之后,它的状态就是 Unstarted
,然而当 Start 方法启动之后,线程的状态将会从 Unstarted
切换到 Running
状态,下面的代码展示了这种轮转。
static void Main(string[] args)
{
Thread t = new Thread(new ThreadStart(MyThreadMethod));
Console.WriteLine("The thread's state is:" + t.ThreadState.ToString());
t.Start();
Console.WriteLine("The thread's state is:" + t.ThreadState.ToString());
}
static void Main(string[] args)
{
Thread t = new Thread(new ThreadStart(MyThreadMethod));
t.Start();
t.IsBackground = true;
Console.WriteLine(“The thread's background status is: “+t.IsBackground.ToString());
Console.Read();
}
除了启动线程,还可以通过 Suspend() 和 Resume() 方法来 挂起 和 恢复 线程, 值得注意的是,你只能 恢复 你之前通过 Suspend 方法 挂起的线程,如下代码所示:
static void Main(string[] args)
{
Thread t = new Thread(new ThreadStart(MyThreadMethod));
t.Start();
t.Suspend(); //Suspends the newly created thread
t.Resume(); //Resumes the suspended thread
Console.Read();
}
值得注意的是,现在的 Thread.Suspend()
和 Thread.Resume()
方法都是被标记成弃用的状态了,取而代之的做法是:使用 AutoResetEvent
和 EventWaitHandle
方法来实现多线程之间的同步。
设置线程优先级
可以给一个线程赋予优先级,从而和内存中的其他线程争抢 CPU 时间,在 C# 中是使用 ThreadPriority 枚举来表示,大体上有如下值: Lowest, BelowNormal, Normal, AboveNormal 和 Highest,下面的代码展示了如何给这两个线程赋予优先级。
class Program
{
static void Main(string[] args)
{
Thread thread1 = new Thread(new ThreadStart(Method1));
Thread thread2 = new Thread(new ThreadStart(Method2));
thread1.Priority = ThreadPriority.Highest;
thread2.Priority = ThreadPriority.Lowest;
thread2.Start();
thread1.Start();
Console.Read();
}
static void Method1()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("First thread: " + i);
}
}
static void Method2()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Second thread: " + i);
}
}
}
从上面的输出结果中可以看出,Thread1 先于 Thread2 执行完,即使 Thread2.Start 是先启动的,是不是很好的演示了优先级的概念。
线程是昂贵的,因为线程的整个生命周期需要消耗太多的资源,比如:初始化,上下文切换,释放使用的资源 等等,所以在用 多线程 之前需要想好是否真的要这么做,当用多线程
的时候,适当的使用 线程池 (ThreadPool)
是一个非常好的做法,毕竟线程池内部会帮你自动创建,释放,调度线程,你只需要傻傻的用即可,同时也是提升程序响应的利器。
译文链接:https://www.infoworld.com/article/3035134/how-to-work-with-threads-in-c.html
以上就是C# 中如何使用Thread的详细内容,更多关于c# 使用 Thread的资料请关注得得之家其它相关文章!
本文标题为:C# 中如何使用Thread
- Unity Shader实现模糊效果 2023-04-27
- Unity3D实现渐变颜色效果 2023-01-16
- .NET CORE DI 依赖注入 2023-09-27
- c# 模拟线性回归的示例 2023-03-14
- Oracle中for循环的使用方法 2023-07-04
- C# 使用Aspose.Cells 导出Excel的步骤及问题记录 2023-05-16
- 如何使用C# 捕获进程输出 2023-03-10
- WPF使用DrawingContext实现绘制刻度条 2023-07-04
- 在C# 8中如何使用默认接口方法详解 2023-03-29
- user32.dll 函数说明小结 2022-12-26