C#多线程编程_wpf和winform的区别
目录
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();
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/198362.html原文链接:https://javaforall.cn
相关文章
- c# 递归算法
- c#数组赋初值_C#数组初始化
- C#使用#ziplib压缩和解压缩文件
- WPF是什么_wpf documentviewer
- C# List排序_wpf listview 排序
- 【地铁上的Redis与C#】数据类型(七)--List类型
- WPF连接MySQL:实现令人惊叹的功能(wpf 连接mysql)
- C#正则实现Ubb解析类的代码
- C#取得Web程序和非Web程序的根目录的N种取法总结
- c#读取文件内容存放到int数组array.txt
- Javascript调用C#代码
- C#实现ComboBox自动匹配字符
- C#数据结构之循环链表的实例代码
- C#中读写INI文件的方法例子
- c#调用arcgis地图rest服务示例详解(arcgis地图输出)
- c#生成excel示例sql数据库导出excel
- C++中const的实现细节介绍(C,C#同理)
- C#执行Javascript代码的几种方法总结
- C#串口通信实现方法
- C#实现绘制面形图表的方法详解