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)


相关推荐

  • 如何查看redis版本号[通俗易懂]

    如何查看redis版本号[通俗易懂]Windows下查看redis版本号1、打开redis所在目录启动redis-server服务器端。2、启动redis-cli客户端。3、客户端输入:info结果如下:linux下查看redis的版本号linux下查看redis的版本有两种方式:1、查看服务端版本**二者都可以**redis-server–versionredis-server-v输出:2、查看客户端版本**二者都可以**redis-cli-vredis-cli–versio.

  • 极限学习机(ELM)从原理到程序实现(附完整代码)

    极限学习机(ELM)从原理到程序实现(附完整代码)摘要:极限学习机(ELM)是当前一类非常热门的机器学习算法,被用来训练单隐层前馈神经网络(SLFN)。本篇博文尽量通俗易懂地对极限学习机的原理进行详细介绍,之后分析如何用MATLAB实现该算法并对代码进行解释。本文主要内容如下:算法的原理、算法程序实现、点击跳转至全部文件下载页

  • U盘量产检查闪存编码失败_北信源安全u盘忘记密码

    U盘量产检查闪存编码失败_北信源安全u盘忘记密码没什么特殊的想法就是看自己很久没有更新关于题解类的文章了而已(其实这是我好久之前做的,只是把它从洛谷博客搬到了这里而已)题目首先分析题目要二分他长成这个亚子太二分了所以就要二分最好是先排一下序吧这样我们在输入的时候就能顺便处理出l和r的值,考虑我们二分的是一个接口的大小,所以我们的答案肯定是在最大的接口和最小的接口之间啊,所以这样做是可…

    2022年10月12日
  • 在WAMPSERVER下增加多版本的PHP(PHP5.3,PHP5.4,PHP5.5)支持。

    在WAMPSERVER下增加多版本的PHP(PHP5.3,PHP5.4,PHP5.5)支持。

  • 企业社交,阿里钉钉向左,企业微信向右

    企业社交,阿里钉钉向左,企业微信向右在企业社交领域里,阿里钉钉和企业微信这两大巨头,正在各自轨道上加速突进,以不同的模式在企业级服务市场引发深刻变化。进击的阿里钉钉截止到2018年底,阿里钉钉上的企业组织达到了700万家以上,也就是说钉钉已经实现了对16%中国企业的覆盖。但进击的钉钉并不满足于此,它在两个方向上发起了新的挑战:一是在巩固原有中小企业市场的基础上,开始向大企业市场延伸;并以全链路数字化办公解决方案为基础,将钉钉从“…

  • classcastingexception_class session

    classcastingexception_class sessionClassCastException是JVM在检测到两个类型间转换不兼容时引发的运行时异常。此类错误通常会终止用户请求。在执行任何子系统的应用程序代码时都有可能发生ClassCastException异常。通过转换,可以指示Java编译器将给定类型的变量作为另一种变量来处理。对基础类型和用户定义类型都可以转换。Java语言规范定义了允许的转换,其中大多数可在编译时进行验证。不过,某些转换还需要运行

发表回复

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

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