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();
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/198362.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Jsp中EL表达式不解析问题

    Jsp中EL表达式不解析问题记一次很郁闷的Bug         前一天晚上写好的JSP页面,然后发布在Tomcat上面之后,一切正常。第二天早上打开之后,发现css样式始终加载不出来,刚开始以为网速问题(前一天晚上测试一切正常,因此排除代码问题),测试网络一切正常,这就跟尴尬了,那css加载不出来是什么意思,难不成遇见鬼了?于是在发布后的页面检查代码,发现页面没有解析EL表达式,找到问题就想办法解决,于是开始折腾,最终还是…

    2022年6月13日
    28
  • linux卸载软件_centos7如何卸载

    linux卸载软件_centos7如何卸载1、首先使用:rpm-qa|grepjava,如下图所示:2、然后依次执行:rpm-e–nodepspython-javapackages-3.4.1-11.el7.noarch,其中python-javapackages-3.4.1-11.el7.noarch是包的名称,如下图所示:3、再次执行rpm-qa|grepjava进行查看,如下图所示:4…

    2022年9月22日
    0
  • java后端开发题库_2020年Java题库整理

    2020年Java题库整理(WUST)前言:去我的个人博客阅读效果更好哟。知识点整理:1.Java语言具有跨平台性,是一种面向对象的语言,程序具有可移植性,不可多继承。2.Java的标准版主要用于桌面级的应用和数据库的开发。3.main()的头定义只能为publicvoidmain,一个类中可以没有main()方法。4.接口可以继承接口。5.静态内部类不能访问外部类的非静态成员,内部类可…

    2022年4月11日
    44
  • linux安装有几种方法_linux查看gcc是否安装

    linux安装有几种方法_linux查看gcc是否安装Linux安装Pycharm

    2022年10月18日
    0
  • 经纬度距离计算 python_Python已知两坐标求距离

    经纬度距离计算 python_Python已知两坐标求距离#coding:utf-8#封装函数importmathdefcal_dis(latitude1,longitude1,latitude2,longitude2): latitude1=(Math.PI/180)*latitude1 latitude2=(Math.PI/180)*latitude2 longitude1=(Math.PI/180)*longitu

    2022年9月15日
    1
  • Oracle number类型详解

    Oracle number类型详解Oraclenumber类型详解简介基本说明容易出错情况Number与MySQL数据类型简介Oracle的number类型比较复杂,很多限制,但是掌握一点小技巧就能轻松搞定。基本说明number(precision,scale)precision表示数字中的有效位,从左边第一个不为0的数算起,小数点和负号不计入有效位数precision的取值范围是[1,38]precision默认值为38,number等价于number(38)scale大于0,表示数字精确到小数点右边的位数,numb

    2022年7月24日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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