大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
1. 多线程描述
线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。在多线程之下可以通过分配线程,同时处理多个任务。
2. 线程生命周期
线程生命周期开始于 System.Threading.Thread 类的对象被创建时,结束于线程被终止或完成执行时。
下面列出了线程生命周期中的各种状态:
- 未启动状态:当线程实例被创建但 Start 方法未被调用时的状况。
- 就绪状态:当线程准备好运行并等待 CPU 周期时的状况。
- 不可运行状态:下面的几种情况下线程是不可运行的:
- 已经调用 Sleep 方法
- 已经调用 Wait 方法
- 通过 I/O 操作阻塞
- 死亡状态:当线程已完成执行或已中止时的状况。
3. 线程的常用属性与方法
属性 | 描述 |
---|---|
CurrentContext | 获取线程正在其中执行的当前上下文 |
CurrentCulture | 获取或设置当前线程的区域性 |
CurrentPrincipal | 获取或设置线程的当前负责人(对基于角色的安全性而言) |
CurrentThread | 获取当前正在运行的线程 |
CurrentUICulture | 获取或设置资源管理器使用的当前区域性以便在运行时查找区域性特定的资源 |
ExecutionContext | 获取一个 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息 |
IsAlive | 获取一个值,该值指示当前线程的执行状态 |
IsBackground | 获取或设置一个值,该值指示某个线程是否为后台线程 |
IsThreadPoolThread | 获取一个值,该值指示线程是否属于托管线程池 |
ManagedThreadId | 获取当前托管线程的唯一标识符 |
Name | 获取或设置线程的名称 |
Priority | 获取或设置一个值,该值指示线程的调度优先级 |
ThreadState | 获取一个值,该值包含当前线程的状态 |
方法 看以下链接:
常用方法描述.
4. 线程操作
(1) 创建线程
using System;
using System.Threading;
namespace MultithreadingApplication
{
class ThreadCreationProgram
{
public static void CallToChildThread()
{
Console.WriteLine("Child thread starts");
}
static void Main(string[] args)
{
//创建新的线程
ThreadStart childref = new ThreadStart(CallToChildThread);
Console.WriteLine("In Main: Creating the Child thread");
//赋值线程引用
Thread childThread = new Thread(childref);
//开始新的线程
childThread.Start();
Console.ReadKey();
}
}
}
(2) 管理线程
using System;
using System.Threading;
namespace MultithreadingApplication
{
class ThreadCreationProgram
{
public static void CallToChildThread()
{
Console.WriteLine("Child thread starts");
// 线程暂停 5000 毫秒
int sleepfor = 5000;
Console.WriteLine("Child Thread Paused for {0} seconds",
sleepfor / 1000);
Thread.Sleep(sleepfor);
Console.WriteLine("Child thread resumes");
}
static void Main(string[] args)
{
ThreadStart childref = new ThreadStart(CallToChildThread);
Console.WriteLine("In Main: Creating the Child thread");
Thread childThread = new Thread(childref);
childThread.Start();
Console.ReadKey();
}
}
}
(3) 销毁线程
using System;
using System.Threading;
namespace MultithreadingApplication
{
class ThreadCreationProgram
{
public static void CallToChildThread()
{
try
{
Console.WriteLine("Child thread starts");
// 计数到 10
for (int counter = 0; counter <= 10; counter++)
{
Thread.Sleep(500);
Console.WriteLine(counter);
}
Console.WriteLine("Child Thread Completed");
}
catch (ThreadAbortException e)
{
Console.WriteLine("Thread Abort Exception");
}
finally
{
Console.WriteLine("Couldn't catch the Thread Exception");
}
}
static void Main(string[] args)
{
ThreadStart childref = new ThreadStart(CallToChildThread);
Console.WriteLine("In Main: Creating the Child thread");
Thread childThread = new Thread(childref);
childThread.Start();
// 停止主线程一段时间
Thread.Sleep(2000);
// 现在中止子线程
Console.WriteLine("In Main: Aborting the Child thread");
childThread.Abort();
Console.ReadKey();
}
}
}
- .NET在正常情况下,不去特意执行等待的情况下,线程在执行完成之后会自动进行销毁。并不用手动进行销毁。
(4) 在使用线程中同步使用其他线程功能
在子线程中,需要同时使用主线程的功能时需要进行引用,但是不可以直接进行调用,需要使用Invoke进行同步或者使用BeginInvike进行异步,以下代码就是在点击按钮后执行读取文件的同时,将逐行的数据打印在软件的主线程窗口上面的操作。
private void Readfilesd()
{
string line;
gyrodatabutton.Invoke((MethodInvoker)delegate {
gyrodatabutton.Enabled = false;
});
PulicValue.DevContr = true;
if (checkBox2.Checked)
{
try
{
//打开文件
System.IO.StreamReader file = new System.IO.StreamReader(@".\GYRODATA.txt");
//读取每一行数据
while ((line = file.ReadLine()) != null)
{
Thread.Sleep(1000);
//WaitFunctions(30);
try
{
if (line.Length > 0)
{
byte[] dat = strToToHexByte(line);
serialPort1.Write(dat, 0, dat.Length);
//将发送的数据显示在接收发送显示框内
//showtextBox.AppendText(@"TX:" + line + "\r\n");
//在多线程内需要跨线程同步使用操作
showtextBox.Invoke((MethodInvoker)delegate {
showtextBox.AppendText(@"TX:" + line + "\r\n");
});
}
}
catch (Exception)
{
serialPort1.Write(line);//串口发送数据
break;
}
if (PulicValue.DevContr == false)
{
break;
}
}
file.Close();
}
catch
{
MessageBox.Show("文件打开失败", "错误提示");
}
}
gyrodatabutton.Invoke((MethodInvoker)delegate {
gyrodatabutton.Enabled = true;
});
}
private void button2_Click(object sender, EventArgs e)
{
ThreadStart readsendData = new ThreadStart(Readfilesd);
Thread childThread = new Thread(readsendData);
childThread.Start();
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/198362.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...