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

C#多线程编程_wpf和winform的区别目录1.多线程描述2.线程生命周期3.线程的常用属性与方法4.线程操作(1)创建线程(2)管理线程(3)销毁线程1.多线程描述线程被定义为程序的执行路径。每个线程都定义了一个独特的控制流。在多线程之下可以通过分配线程,同时处理多个任务。2.线程生命周期线程生命周期开始于System.Threading.Thread类的对象被创建时,结束于线程被终止或完成执行时。下面列出了线程生命周期中的各种状态:未启动状态:当线程实例被创建但Start方法未被调用时的状况。就绪状

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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();
        }
    }
}

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

(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账号...

(0)


相关推荐

  • python计算平均数,方差,标准差_抽样平均误差的计算

    python计算平均数,方差,标准差_抽样平均误差的计算python计算平均平方误差(MSE)的实例我们要编程计算所选直线的平均平方误差(MSE),即数据集中每个点到直线的Y方向距离的平方的平均数,表达式如下:MSE=1n∑i=1n(yi−mxi−b)2最初麻烦的写法#TODO实现以下函数并输出所选直线的MSEdefcalculateMSE(X,Y,m,b):in_bracket=[]foriinrange(len(X)):num…

  • Java IO流处理 面试题汇总

    Java IO流处理 面试题汇总说明:本节内容来源于网络汇总输入输出流是相对于内存而言的!1、面试题汇总(1)java中有几种类型的流?字符流和字节流。字节流继承inputStream和OutputStream,字符流继承自InputSteamReader和OutputStreamWriter。(2)谈谈JavaIO里面的常见类,字节流,字符流、接口、实现类、方法阻塞答:输入流就…

  • XOR加密初识

    XOR加密初识XOR加密利用了两次异或操作仍为原值的特性。通过一个密钥,将明文与密钥进行异或操作,从而对明文加密,解密时再将密文与密钥进行一次异或操作就能恢复出明文。下面是C语言简单模拟:#include#include#defineKEY’K’//密钥intmain(){intorig_char,new_char;while((orig_char=getc

  • 【新产品】高性能网络服务器pinRemote 发布 | 附下载

    【新产品】高性能网络服务器pinRemote 发布 | 附下载

  • wpsword表格转换成excel表格_wps文档表格怎么转换成wps表格

    wpsword表格转换成excel表格_wps文档表格怎么转换成wps表格相信经常做表的小伙伴,总会遇到Excel的格式转换问题,那么其实只要你通过以下几个方式,即可快速实现文件格式的转换,不信的话接下来就带各位一起看看吧!一、电脑端1.WPS格式转换首先是我们的WPS里面自带的格式转换功能,只要我们选择【PDF转Excel】按钮,然后就可以快速对PDF里面的表格提取出来,非常方便,平时需要做数据分析的小伙伴一定要记住这个操作了。2.office当然,如果你平时打印表格…

  • 软件测试基础理论(总结)[通俗易懂]

    软件测试基础理论(总结)[通俗易懂]1. 软件的三个要素:程序(实行特定功能的代码) 文档(支持代码运行)数据(支持程序运行一切有关)2. 软件的产品质量指的是?1)质量是指实体特性的综合,表示实体满足明确的或隐含要求的能力。3. 软件测试的目的:1)验证软件是否满足软件开发合同或者项目开发计划,系统/子系统设计文档,软件需求规格说明,软件产品说明等规定的软件质量要求2)通过测试,发现软件缺陷 3

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号