c(多线程编程)

c(多线程编程)c 多线程编程什么是多线程 相必有些程序或者计算机基础的就会有所了解 我就不做过多赘述了 确实不知道的 可以反手百度 线程开启方法之 委托线程开启 c 中开启多线程的方法之一 是调用委托的 BeginInvoke 方法 可以当即为该委托打开一个新的线程来跑其包含的方法 参数 BeginInvoke 方法有俩个默认的参数 如果当前委托是有参数的 那么委托的参数写在该方法默认参数的前面 判断线程状态 BeginInvoke 方法有个 IAsyncResult 类型的返回值 调用该返回值的 Is

c#

多线程编程

  • 什么是多线程,相必有些程序或者计算机基础的就会有所了解,我就不做过多赘述了,确实不知道的,可以反手百度。
  • 前台线程与后台线程:一个应用程序有没有结束主要取决于其前台线程运行完了没,如果前台线程全都运行完了,那么这个程序就结束了,所有没运行完的后台线程都会被强制终止。main方法是前台线程,通过Thread创建的线程默认是前台,通过异步委托创建的默认是后台。具体用法往下看。

线程开启方法之——异步委托

  • 写在前面:异步委托的方法紧支撑FrameWork c#程序 不支持Code c#程序。另外不会用委托的去这篇博客康康委托常用操作合集
  • 线程开启:c#中开启多线程的方法之一,是调用委托的BeginInvoke()方法,可以当即为该委托打开一个新的线程来跑其包含的方法。
  • 参数:BeginInvoke()方法有俩个默认的参数,如果当前委托是有参数的,那么委托的参数写在该方法默认参数的前面。
  • 判断线程状态:BeginInvoke()方法有个IAsyncResult类型的返回值,调用该返回值的IsCompleted参数可以知道当前线程有没有被执行完。
  • 得到委托返回值:如果要得到该委托的返回值,那么需要在线程执行完之后调用EndInvoke()方法该方法有一个参数,就是执行BeginInvoke()方法时返回的IAsyncResult。
  • 举个例子:
using System; using System.Threading; using System.Threading.Tasks; namespace SikiCSharp高级2 { 
    class Program { 
    static int Test1(string s) { 
    Console.WriteLine(s); Thread.Sleep(20); return 123; } static void Main(string[] args) { 
    Func<string, int> fu = Test1; IAsyncResult ir = fu.BeginInvoke("开启子线程", null, null); Console.WriteLine("主线程输出"); while(ir.IsCompleted==false) { 
    Console.Write("。"); } int a = fu.EndInvoke(ir); Console.Write(a); } } } 
  • 第二种判断线程结束的方法:可以使用IAsyncResult对象的AsyncWaitHandle.WaitOne();方法,来让当前线程等待IAsyncResult所表示的子线程一会,传入一个int型参数表示等待多久,单位ms。返回值是一个bool型,如果在等待时间内子线程结束了,则返回一个true。否则返回false。(由于这个改变比较简短,就不举例子了)
  • 第三种判断线程结束的方法:这边就用到了BeginInvoke方法的内置的俩个参数,倒数第二个参数是回调函数,自己定义一个回调函数,传入其中,线程结束后会自动调用该函数,倒数第一个参数是传给回调函数的一个参数,这个参数是什么都可以,回调函数可以通过固定的IAsyncResult参数取到这个参数。回调函数定义时写上一个IAsyncResult型的参数,线程结束调用时系统会自动将其传入。
    如果要取得这个子线程的返回值的话,不妨将委托作为最后一个参数,传给回调函数,回调函数取得这个委托之后调用其EndInvoke方法来取得返回值。
    举例:

using System; using System.Threading; using System.Threading.Tasks; namespace SikiCSharp高级2 { 
    class Program { 
    static int Test1(string s) { 
    Console.WriteLine(s); Thread.Sleep(200); return 123; } static void Main(string[] args) { 
    Func<string, int> fu = Test1; IAsyncResult ir = fu.BeginInvoke("开启子线程", CallBack, fu); bool a = ir.AsyncWaitHandle.WaitOne(100); if(a) { 
    Console.WriteLine("子线程输出"); } Thread.Sleep(200); a = ir.AsyncWaitHandle.WaitOne(100); if (a) { 
    Console.WriteLine("子线程输出2"); } Console.WriteLine("主线程输出"); } static void CallBack(IAsyncResult ir) { 
    Func<string, int> a = ir.AsyncState as Func<string, int>; Console.WriteLine(a.EndInvoke(ir)); } } } 

线程开启方法之——Thread

  • 写在前面:开启新的子线程这种事情,果然还是交给专业的来省事的多
  • 线程开启:创建一个新的Thread对象,给其传入一个方法(这个方法可以是静态的也可以不是静态的,因此可以调用其他对象的方法,传参的事就交给对象内部自己处理了)作为参数。就定义了一个执行该方法的线程。调用Thread对象的Start();方法线程就会开跑。
    举个例子:
using System; using System.Threading; using System.Threading.Tasks; namespace SikiCSharp高级2 { 
    class Program { 
    static void Main(string[] args) { 
    MyThread mt = new MyThread(123, "芜湖起飞"); //这个类的具体内容看下面那份代码块 Thread th = new Thread(mt.go); th.Start(); Console.WriteLine("主线程输出"); } } } 
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace SikiCSharp高级2 { 
    class MyThread { 
    int a = 0; string b = ""; public MyThread(int a,string b) { 
    this.a = a; this.b = b; } public void go() { 
    Console.WriteLine("得到的数字为:" + a); Thread.Sleep(2000); Console.WriteLine(b); } } } 
  • 有关前台后台:Thread创建的默认是前台线程,可以通过将Thread对象的IsBackground属性改程true来将其改为后台线程。
  • 线程排队等待:在一个线程中调用另一个Thread对象的Join方法,就是让当前线程等目标线程执行完再继续。
    比如:
main() { 
    Thread t = new Thread(Test1); t.Join();//这句话就是让main线程等t线程执行完再执行。 } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

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


相关推荐

  • FEC原理及其实现[通俗易懂]

    FEC原理及其实现[通俗易懂]感谢原作者:http://blog.csdn.net/rootusers/article/details/49097257视频会议中通常使用的FEC/QOS技术,这方面的资料比较复杂和稀少,根据这么多年的工作经验,做一下分享。 在IP视频通话中丢包造成的影响多种多样。其中对视频质量的影响主要有:马赛克现象、局部变形(图像的某些区域不清晰)、图像模糊、屏幕频繁刷新或闪

    2022年8月11日
    9
  • php图片加水印(华为关水印)

    很多站长朋友们都知道,Phpcmsv9有自带的水印功能。今天无忧主机小编在给一个朋友修改网站时,询问小编能否把Phpcmsv9自带的水印功能去掉呢,因为有时候在编辑器中上传图片时,不希望上传的图片被自动加上phpcmsv9自带的水印。无忧主机小编分析:既然是程序中的功能,那么就一定有一段代码控制着这个功能。通过进一步的查找资料,小编找得到了这个功能所在的文件以及相应的控制代码。下面无忧主机小编…

    2022年4月12日
    40
  • 怎么检查iis是否安装成功_注册表信息

    怎么检查iis是否安装成功_注册表信息利用注册表检测IIS是否安装

    2022年4月21日
    104
  • 运维mysql数据库面试题_运维面试题之数据库

    运维mysql数据库面试题_运维面试题之数据库mysql篇:mysql主从复制原理?mysql的复制是基于3个线程1、master上的binlogdump线程负责把binlog事件传到slave2、slave上面的IO线程负责接收binlog事件,并写入relaylog3、save上面的SQL线程负责读取relaylog并执行innodb和myisam引擎的主要区别?InnoDB支持事物,MyISAM不支持InnoDB支持外键,M…

    2022年5月2日
    43
  • 360天擎无密码退出和卸载一样吗_奇安信天擎退出密码

    360天擎无密码退出和卸载一样吗_奇安信天擎退出密码无密码退出删除配置(360Safe\EntClient\conf\EntBase.dat)**注:**删除时提示权限不够无法删除,使用360自带的文件粉碎机将文件粉碎即可无密码退出360天擎(重新打开程序时EntBase.dat会再次生成)修改配置(将EntBase.dat中uipass、qtpass两项值置空)**注:**修改时提示权限不够无法修改,需先关闭【设置】【防护中心】【自我保护】功能卸载只能通过修改配置(将EntBase.dat中uipass、qtpass两项值置空)

    2022年9月25日
    3
  • JAVA之文件操作[通俗易懂]

    JAVA之文件操作[通俗易懂]Console此类包含多个方法,可访问与当前Java虚拟机关联的基于字符的控制台设备(如果有)。虚拟机是否具有控制台取决于底层平台,还取决于调用虚拟机的方式。如果虚拟机从一个交互式命令行开始启动,且没有重定向标准输入和输出流,那么其控制台将存在,并且通常连接到键盘并从虚拟机启动的地方显示。如果虚拟机是自动启动的(例如,由后台作业调度程序启动),那么它通常没有控制台。如果此虚拟机具

    2025年7月17日
    3

发表回复

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

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