目录:

 1:线程简介

2:怎么操作线程

4:简单的获奖机

    5:应用程序域

 
线程:是Windows任务调度的最小单位。线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
作用:
   让计算机"同时"做多件事情,节约时间。

  多线程可以让一个程序“同时”处理多个事情。

  后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况

 
解决问题:进程是一个资源的拥有者,因而在进程的创建、撤销、和切换的过程中,系统必须为之付出较大的时空开销,限制了并发程度的进一步提高
 
怎么操作线程?

创建线程:

1:初始化

Thread thread = new Thread(ThreadWorkFun);//ThreadWorkFun是一个委托

2:

  new Thread(() =>
{
Console.WriteLine("ok");
}
).start();

开启线程:

 thread.Start();

一个具体的例子:

        //任何代码都执行在线程中的,当前main方法执行在主线程中,(也就是默认线程)
static void Main(string[] args)
{
//创建一个线程,执行当然线程的执行入口ThreadWork
Thread thread = new Thread(ThreadWork);
thread.Start();//告诉线程你可以调度我了
Console.WriteLine("==============结束");
Console.ReadKey();
}
static void ThreadWork()
{
for (int i = ; i < ; i++)
{
Console.WriteLine(i);
}
}

结果:结果不确定,ThreadWorkFun什么时候执行,由操作系统决定,

注意:当线程指向的方法体执行完成的时候就自动销毁了

Thread的常用属性和方法

  Abort():在调用此方法的线程上引发 ThreadAbortException,终止线程--尽量少用,因为会抛出异常,如果抛异常会极大影响效率。

    GetDomain():返回当前线程正在其中运行的当前域。

   Priority:设置线程的优先级   thread.Priority = ThreadPriority.Highest;
        ManagedThreadId:  int num= thread.ManagedThreadId;//线程的编号,可以用于区分不同的线程
        CurrentThread.Name :获得当前线程的名字

Join:线程等待

 thread.join();//哪个线程执行当前代码的线程等待这个线程执行完成

  IsBackground:获取或设置一个值,该值指示某个线程是否为后台线程,值默认是false:前台线程:只有所有的前台线程都关闭才能完成程序关闭。后台线程:只要所有的前台线程结束,后台线程自动结束

 多线程实现的摇奖机

namespace 摇奖器
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
InitLabel();
InitName(); }
public Label label = new Label();
public Dictionary<int, string> Dic = new Dictionary<int, string>();
bool IsTure;
public void InitLabel()
{
label.Text = "";
label.Location = new Point(, );
label.AutoSize = true;
this.Controls.Add(label);
}
public void InitName()
{
string[] names = File.ReadAllLines("name.txt",Encoding.Default);
for (int i = ; i < names.Length; i++)
{
Dic.Add(i, names[i]);
}
} private void Form1_Load(object sender, EventArgs e)
{
IsTure = false;
} private void btnBegin_Click(object sender, EventArgs e)
{
if (btnBegin.Text == "开始")
{
btnBegin.Text = "结束";
IsTure = true;
new Thread(() =>
{
Random r = new Random();
while (IsTure)
{
if (label.InvokeRequired)//判段lable标签是否是由当前线程创建的,解决跨线程调用的问题
{
Action SetLabelText=delegate()//匿名委托
{
label.Text = Dic[r.Next(, Dic.Count)];
};
label.Invoke(SetLabelText);
}
Thread.Sleep();//当前线程休息一下
} }).Start();
}
else
{
IsTure = false;
btnBegin.Text = "开始";
}
}
}
}
应用程序域:只有DotNet程序才会有的概念
 应用程序域就是隔离exe。可以加载多个程序集,
一个进程可以有多个应用程序域
一个应用程序域可以跑多个线程
一个线程同一时间只可以执行在一个应用程序域里面,但线程可以穿透应用程序域
例子:
       static void Main(string[] args)
{
AppDomain appDomain = AppDomain.CreateDomain("ghr");// 创建一个应用程序域
appDomain.ExecuteAssembly("QQ.exe");//启动qq程序
Console.WriteLine("主域执行完成");
}

了解更多:http://msdn.microsoft.com/zh-cn/library/system.threading.thread_members

多线程(Thread),其实很简单!的更多相关文章

  1. Delphi 的多线程使用已经很简单了

    先看一个非多线程的例子, 代码执行时不能进行其它操作(譬如拖动窗体): {自定义方法: 在窗体上绘制...} procedure MyMethod; var   i: Integer; begin   ...

  2. Java多线程Thread

    转自:http://www.cnblogs.com/lwbqqyumidi/p/3804883.html Java总结篇系列:Java多线程(一)   多线程作为Java中很重要的一个知识点,在此还是 ...

  3. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  4. 异步和多线程Thread

    刚接触线程的时候,感觉这个东西好神奇.虽然不是很明白,就感觉它很牛逼. 参考了一些大佬写的文章: https://www.cnblogs.com/yilezhu/p/10555849.html这个大佬 ...

  5. 多线程-Thread和ThreadPool

    多线程原理 多线程都是基于委托的. 多线程优缺点 缺点: 1.导致程序复杂,开发调试维护困难,特别是线程交互. 2.线程过多导致服务器卡死,因为占用CPU 内存等资源. 优点: 1.良好的交互,特别对 ...

  6. 很简单的Java断点续传实现原理

    原理解析 在开发当中,"断点续传"这种功能很实用和常见,听上去也是比较有"逼格"的感觉.所以通常我们都有兴趣去研究研究这种功能是如何实现的? 以Java来说,网 ...

  7. 2.匿名类,匿名类对象,private/protected/public关键字、abstract抽象类,抽象方法、final关键字的使用,多线程Thread类start方法原理

    package com.bawei.multithread; //注意:模板方法我们通常使用抽象类或者抽象方法!这里我们为了方便在本类中使用就没有使用抽象类/抽象方法 public class Tem ...

  8. 多线程--Thread.join方法

    在Thread类的Api中,Join的作用是让当前线程等待目标线程结束之后才继续执行. thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.  比如在线程B ...

  9. 【玩转SpringBoot】看似复杂的Environment其实很简单

    喜欢写代码,讨厌配环境 我相信这十个字的小标题代表了大多数码农的心声. 十年前读大学时,学校开设了C语言还有C++.但是学习这两种语言,对于新手来说非常没有成就感. 于是我就在校门口买个光盘,装个VS ...

随机推荐

  1. Beej网络socket编程指南

    bind()函数 一旦你有一个套接字,你可能要将套接字和机器上的一定的端口关联 起来.(如果你想用listen()来侦听一定端口的数据,这是必要一步--MUD 告 诉你说用命令 "telne ...

  2. Boostrap 模态框 水平垂直居中问题

            var editorB = new UE.ui.Editor({ initialFrameHeight: 350, initialFrameWidth: 600 });         ...

  3. java学习之线程

    一.线程总述: 线程是java当中一个重要的内容,如果想说线程的话,那我们应该先来讲一下什么是进程. 进程:那么什么是进程呢,进程从字面上来理解就是,正在进行的程序.就比如说我们在windows当中打 ...

  4. git svn cygwin_exception

    git for windows 2.5 版本发布了,更新之后,使用git svn的时候,就出错 git svn rebase Or git svn dcommit After a update git ...

  5. Why Creating a Meaningful Morning Routine Will Make You More Successful

    https://medium.com/life-learning/how-creating-a-meaningful-morning-routine-will-make-you-more-succes ...

  6. 在Raspberry配置优化安装LNMP环境总结

    在Raspberry配置优化安装LNMP环境总结 apt-get update apt-get install nginx apt-get install php5-fpm php5-cli php5 ...

  7. 进程与线程(7) 进程间通信之信号量 (java os)

    花3分钟浏览一下: http://blog.csdn.net/liu765023051/article/details/8067601 1.生产者,消费者的列子. 2.互斥和同步到底什么东西? 互斥是 ...

  8. pow(x,n) leecode

    https://oj.leetcode.com/problems/powx-n/ 提交地址 快速幂的使用,可以研究一下 public class Solution { public double po ...

  9. 完美转换MySQL的字符集 Mysql 数据的导入导出,Mysql 4.1导入到4.0

    MySQL从4.1版本开始才提出字符集的概念,所以对于MySQL4.0及其以下的版本,他们的字符集都是Latin1的,所以有时候需要对mysql的字符集进行一下转换,MySQL版本的升级.降级,特别是 ...

  10. VC++深入详解-第一章学习心得(二)

    前面介绍到了注册窗口,接下来进行窗口的创建,利用CreateWindow函数,结构如下 CreateWindowExW( DWORD dwExStyle, LPCWSTR lpClassName, / ...