线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。在多线程之下可以通过分配线程,同时处理多个任务。
线程生命周期开始于 System.Threading.Thread 类的对象被创建时,结束于线程被终止或完成执行时。
下面列出了线程生命周期中的各种状态:
属性 | 描述 |
---|---|
CurrentContext | 获取线程正在其中执行的当前上下文 |
CurrentCulture | 获取或设置当前线程的区域性 |
CurrentPrincipal | 获取或设置线程的当前负责人(对基于角色的安全性而言) |
CurrentThread | 获取当前正在运行的线程 |
CurrentUICulture | 获取或设置资源管理器使用的当前区域性以便在运行时查找区域性特定的资源 |
ExecutionContext | 获取一个 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息 |
IsAlive | 获取一个值,该值指示当前线程的执行状态 |
IsBackground | 获取或设置一个值,该值指示某个线程是否为后台线程 |
IsThreadPoolThread | 获取一个值,该值指示线程是否属于托管线程池 |
ManagedThreadId | 获取当前托管线程的唯一标识符 |
Name | 获取或设置线程的名称 |
Priority | 获取或设置一个值,该值指示线程的调度优先级 |
ThreadState | 获取一个值,该值包含当前线程的状态 |
方法 看以下链接: 常用方法描述.
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();
}
}
}
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();
}
}
}
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();
}
}
}
在子线程中,需要同时使用主线程的功能时需要进行引用,但是不可以直接进行调用,需要使用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();
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/198362.html原文链接:https://javaforall.cn