前言:本来想根据自己的经验总结一下c#线程相关的知识点, 写之前看了一些其他人的博客,发现自己也就掌握了不到三分之一。。。。希望通过这次的博客将自己的知识点补充一下,写出更直白的博客和初学者分享。

这是我参考的博客地址:http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html  。

这个是他参考的英文原著地址:http://www.albahari.com/threading/

原博客介绍的可以说深入浅出,鞭辟入里。不过我想写出更适合小白的,直接拿去就可以用到程序里的博客。

一. 什么是线程(知道下面几点有助于了解)

1. 一个CPU同一时间只能做一件事,不过它处理信息太快了,甚至我们使用它的时候,把它分成了很多的时钟周期(就是很短的时间间隔),再去把这些之间间隔分配个不同的应用,它也能很顺畅的完成处理。就好像它能同时处理很多事一样,我们根据这一点,就可以进行多线程,和多进程编程了。

2.进程是资源分配的基本单位。我们创建一个程序,默认是一个进程的,这个进程中包含了一个线程(主线程)。现在我们要在这个基础上再去进行创建新的线程。(很多时候需要这样)

3.进程中的线程,可以共享进程中的资源。

4.线程是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。

二.为什么要开启新的线程

有很多时候主线程处理数据消耗太多时间,导致鼠标不能用,程序看起来卡住了。这时候,我们可以把消耗时间的事放到一个单独的线程里,让主线程轻松起来。

三. 多线程的使用

1.目标

在主线程中开启一个线程,线程传回数据在主窗体中的文本框中显示。

下面是所有的代码,其中包括了代理 、Invoke、Lock,的使用。这个小的例子就可以帮助你开始使用线程了。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading; namespace 线程浅析
{
//创建SetValue的委托
public delegate void SetValueDel(string str,object obj); public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Thread.CurrentThread.Name = "MainThread";
} //开启一个线程
private void btnStart_Click(object sender, EventArgs e)
{
//将委托的方法和主窗体传过去
NEWThreadClass threadOneClass = new NEWThreadClass(SetValue, this); Thread TheThreadOne = new Thread(threadOneClass.threadOne);//不需要ThreadStart()也可以 TheThreadOne.Name = "TheThreadOne";//给线程命名,方便调试。这行代码可以省略。 //让线程变为后台线程(默认是前台的),这样主线程结束了,这个线程也会结束。要不然,任何前台线程在运行都会保持程序存活。
TheThreadOne.IsBackground = true;
TheThreadOne.Start();
} //给文本框赋值
private void SetValue(string str, object obj)
{
//lock里面的代码同一个时刻,只能被一个线程使用。其它的后面排队。这样防止数据混乱。
lock (obj)
{
this.txtReturnValue.Text = this.txtReturnValue.Text + str;
}
}
} //建一个类,模拟实际使用情况
public class NEWThreadClass
{
//接收主窗体传过来的委托方法。
public SetValueDel setValueDel; //接收主窗体
public Form form; //用于告诉主线程中锁,是哪一个线程调用的。
static object locker = new object(); public NEWThreadClass(SetValueDel del ,Form fom)
{
this.setValueDel = del;
this.form = fom;
}
//第一个线程,给主线程创建的控件传值。
public void threadOne()
{
//这里获取线程的名字
string threadName = Thread.CurrentThread.Name;
try
{
while (true)
{
//告诉主线程,我要更改你的控件了。
this.form.Invoke((EventHandler)(delegate
{
//如果在这里使用Thread.CurrentThread.Name 获取到的是主线程的名字。
setValueDel(threadName + " :Hello!", locker);//给文本框传值,“自己的名字:Hello!”。
}));
Thread.Sleep( * );//太累了 ,休息三秒。。。。
}
}
catch (Exception ex)
{ }
}
}
}
 

 

c# 线程浅析(代理 、Invoke、Lock)的更多相关文章

  1. Java多线程:线程间通信之Lock

    Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...

  2. 解决Slave SQL线程Waiting for binlog lock

       最近在我们线上库物理备份的时候出现一个奇怪的现象:    我们备份都在从库上备份的,在业务低一般是在晚上2点钟开始备份.有天发现从库的延迟一直在增加,登录上实例,通过show processli ...

  3. 线程系列07,使用lock语句块或Interlocked类型方法保证自增变量的数据同步

    假设多个线程共享一个静态变量,如果让每个线程都执行相同的方法每次让静态变量自增1,这样的做法线程安全吗?能保证自增变量数据同步吗?本篇体验使用lock语句块和Interlocked类型方法保证自增变量 ...

  4. python笔记10-多线程之线程同步(锁lock)

    前言 关于吃火锅的场景,小伙伴并不陌生,吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸. 为了避免这种情况,在下鱼丸的过程中,先锁定操作,让吃火锅的小伙伴停一会,等鱼丸 ...

  5. C#线程同步技术(一) lock 语句

    开篇语: 上班以后,烦恼少了,至少是没有什么好烦的了,只要负责好自己的工作就可以了,因此也有更多的时间去探索自己喜欢的程序.买回来的书已经看了一半,DEMO也敲了不少,昨晚终于在这里开BLOG,记录一 ...

  6. 线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯

    1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值 ...

  7. 【Java并发系列04】线程锁synchronized和Lock和volatile和Condition

    img { border: solid 1px } 一.前言 多线程怎么防止竞争资源,即防止对同一资源进行并发操作,那就是使用加锁机制.这是Java并发编程中必须要理解的一个知识点.其实使用起来还是比 ...

  8. Java线程锁一个简单Lock

    /** * @author * * Lock 是java.util.concurrent.locks下提供的java线程锁,作用跟synchronized类似, * 单是比它更加面向对象,两个线程执行 ...

  9. java并发:线程同步机制之Lock

    一.初识Lock Lock是一个接口,提供了无条件的.可轮询的.定时的.可中断的锁获取操作,所有加锁和解锁的方法都是显式的,其包路径是:java.util.concurrent.locks.Lock, ...

随机推荐

  1. [bzoj1430]小猴打架_prufer序列

    小猴打架 bzoj-1430 题目大意:题目链接. 注释:略. 想法: 我们发现打架的情况就是一棵树. 我们只需要把确定树的形态然后乘以$(n-1)!$表示生成这棵树时边的顺序. 一共$n$个节点我们 ...

  2. 2017-10-02-morning

    T1 一道图论神题(god) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图 ...

  3. Ubuntu 16.04创建Swap分区或增加Swap分区容量(转)

    要在Ubuntu中要创建Swap分区主要有如下2种方式: 一.传统创建方式 一般情况下,我们都会使用dd命令来预先创建交换分区文件,然后再用/dev/zero将该文件的内容全部置零,创建时还将用到bs ...

  4. JSTL-格式标签库

    主页:http://www.cnblogs.com/EasonJim/p/6958992.html的分支页. 一.<fmt:formatNumber> <fmt:formatNumb ...

  5. sql 按中文排序

    sql server:select * from [表名]order by [字段],[字段] collate Chinese_PRC_CS_AS_KS_WS mysql:select * from ...

  6. Android Wear - App Structure for Android Wear(应用结构)

    ---------------------------------------------------------------------------------------------------- ...

  7. JSP简单练习-包装类综合应用实例

    <%@ page contentType="text/html; charset=gb2312" %><!-- JSP指令标签 --> <%@ pag ...

  8. js制造运动的假象-------Day63

    这里用的这个名称可能不合适,只是临时我也没有想起比較相应的名字来,那就这样先写吧. 首先,我先表达下我想实现的是什么效果: 想必大家都玩过,至少见过非常多小游戏,例如说超级玛丽.例如说flappy b ...

  9. PHP + Socket 发送http请求进而实现站点灌水

    本质上实现组装http信息的请求行,头信息.主题信息.參考it自学网 cookie信息和http请求头有非常大关系,注意把http请求头信息传递到函数里面 01-msg.php <?php re ...

  10. nyoj 739 笨蛋的难题四

    笨蛋难题四 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 这些日子笨蛋一直研究股票,经过调研.最终发现xxx公司股票规律,更可喜的是 笨蛋推算出这家公司每天的股价, ...