前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#多线程编程_wpf和winform的区别

C#多线程编程_wpf和winform的区别

作者头像
全栈程序员站长
发布2022-11-01 11:11:24
4640
发布2022-11-01 11:11:24
举报
文章被收录于专栏:全栈程序员必看

目录

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) 创建线程

代码语言:javascript
复制
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();
}
}
}

Jetbrains全家桶1年46,售后保障稳定

(2) 管理线程

代码语言:javascript
复制
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) 销毁线程

代码语言:javascript
复制
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进行异步,以下代码就是在点击按钮后执行读取文件的同时,将逐行的数据打印在软件的主线程窗口上面的操作。

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 1. 多线程描述
  • 2. 线程生命周期
  • 3. 线程的常用属性与方法
  • 4. 线程操作
    • (1) 创建线程
      • (2) 管理线程
        • (3) 销毁线程
          • (4) 在使用线程中同步使用其他线程功能
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档