.NET多线程执行函数
前面几篇文章一直在写LINQ,这里为什么会出现多线程?原因是DebugLZQ在写一个LINQ综合Demo的时候遇到了多线程,便停下手来整理一下。关于多线程的文章,园子里很多很多,因此关于多线程理论性的东西,LZ就不去多说了,这篇博文主要是用最简单的例子,总结下多线程调用函数的相关注意点,重点偏向应用和记忆。
1.多线程调用无参函数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace 多线程
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("主线程开始");
Thread t = new Thread(new ThreadStart(ShowTime));//注意ThreadStart委托的定义形式
t.Start();//线程开始,控制权返回Main线程
Console.WriteLine("主线程继续执行");
//while (t.IsAlive == true) ;
Thread.Sleep();
t.Abort();
t.Join();//阻塞Main线程,直到t终止
Console.WriteLine("--------------");
Console.ReadKey();
}
static void ShowTime()
{
while (true)
{
Console.WriteLine(DateTime.Now.ToString());
}
}
}
}

注意ThreadStart委托的定义如下:
可见其对传递进来的函数要求是:返回值void,无参数。
2.多线程调用带参函数(两种方法)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace 多线程2_带参数
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main线程开始");
Thread t = new Thread(new ParameterizedThreadStart(DoSomething));//注意ParameterizedThreadStart委托的定义形式
t.Start(new string[]{"Hello","World"});
Console.WriteLine("Main线程继续执行"); Thread.Sleep();
t.Abort();
t.Join();//阻塞Main线程,直到t终止
Console.ReadKey();
}
static void DoSomething(object s)
{
string[] strs = s as string[];
while (true)
{
Console.WriteLine("{0}--{1}",strs[],strs[]);
}
}
}
}

注意ParameterizedThreadStart委托的定义如下:
可见其对传入函数的要求是:返回值void,参数个数1,参数类型object

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace 多线程2_带参数2
{
class Program
{
static void Main(string[] args)
{
Guest guest = new Guest()
{
Name="Hello", Age=
};
Thread t = new Thread(new ThreadStart(guest.DoSomething));//注意ThreadStart委托的定义形式
t.Start(); Thread.Sleep();
t.Abort();
t.Join();//阻塞Main线程,直到t终止
Console.ReadKey();
}
}
//
class Guest
{
public string Name { get; set; }
public int Age { get; set; } public void DoSomething()
{
while (true)
{
Console.WriteLine("{0}--{1}", Name, Age);
}
}
}
}

这个还是使用ThreadStart委托,对方法进行了一个封装。
两种方法,可随意选择,第一种貌似简洁一点。
3.线程同步
线程同步的方法有很多很多种volatile、Lock、InterLock、Monitor、Mutex、ReadWriteLock...
这里用lock说明问题:在哪里同步,用什么同步,同步谁?
首先感受下不同步会出现的问题:
代码就是下面的代码去掉lock块。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace 多线程3_同步2
{
class Program
{
static object obj = new object();//同步用 static int balance = ; static void Main(string[] args)
{
Thread t1 = new Thread(new ThreadStart(Credit));
t1.Start(); Thread t2 = new Thread(new ThreadStart(Debit));
t2.Start(); Console.ReadKey();
} static void Credit()
{
for (int i = ; i < ; i++)
{
lock (obj)
{
balance += ;
Console.WriteLine("After crediting,balance is {0}", balance);
}
}
}
static void Debit()
{
for (int i = ; i < ; i++)
{
lock (obj)
{
balance -= ;
Console.WriteLine("After debiting,balance is {0}", balance);
}
}
}
}
}

当然以上是最基本方法,可以用delegate、lambda表达式等简写,具体请参考下篇博文。
小结:多线程调用函数就是这样。在Winform中,控件绑定到特定的线程,从另一个线程更新控件,不应该直接调用该控件的成员,这个非常有用,下篇博文讲
.NET多线程执行函数的更多相关文章
- C#中 多线程执行含有返回值的函数
C# 中,传统的多线程并不支持多线程执行含有返回结果的函数.虽然可以通过制作外壳类来使得返回结果得以保留,但如果一定时间内函数未执行完,简单的外壳类可能就无法满足需求了. class netHelpe ...
- linux进程编程:子进程创建及执行函数简介
linux进程编程:子进程创建及执行函数简介 子进程创建及执行函数有三个: (1)fork();(2)exec();(3)system(); 下面分别做详细介绍.(1)fork() 函数定 ...
- (委托事件处理)关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。
关于多线程执行显示进度条的实例! 之前回答了一篇关于怎么在线程中操作进度条的帖子,估计有人看的不是很明白今天没事,写了一个小小的实例,很简单,就2个文件权当抛砖引玉,希望有更好解决方案的人发表一下意见 ...
- pthread_create多线程执行顺序诡异现象
多线程执行顺序诡异现象谈,你不知道的pthread_create 引文:学而时习之,不亦说乎.总是忙于具体项目,业务功能的实现:关于编程本身的技能都要有些生疏了,于是就选择了几个专题做了一次温习,重点 ...
- Java 线程和多线程执行过程分析
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- selenium+python-unittest多线程执行用例
前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时...那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线程 ...
- selenium+python自动化90-unittest多线程执行用例
前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时... 那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线 ...
- unittest多线程执行用例
前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时... 那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线 ...
- 单线程和多线程执行对比—Python多线程编程
单线程和多线程执行对比 本章使用递归求斐波那契.阶乘与累加函数的执行来对比单线程与多线程: 斐波那契.阶乘与累加(mtfacfib.py): import threading from time ...
随机推荐
- RHAS Linux下架构Lotus Domino详解(附视频)
此处下载操作视频:RHAS Linux下架构Lotus Domino 6.5视频教程 在rhas下架构Lotus Domino 汉化 650) this.width=650;" o ...
- postsharp初体验
首先,有必要先介绍下,什么叫做AOP(Aspect-Oriented Programming,面向切面编程).下图是百度的词条解释 用图来解释可能更直接了当些: ps:图片来自http://www.c ...
- Spark RDD概念学习系列之RDD的5大特点(五)
RDD的5大特点 1)有一个分片列表,就是能被切分,和Hadoop一样,能够切分的数据才能并行计算. 一组分片(partition),即数据集的基本组成单位,对于RDD来说,每个分片都会被一个计 ...
- linux 下查找大于100M的文件
命令行如下 find . -type f -size +100M Linux系统下查找大文件或目录的技巧 当硬盘空间不够时,我们就很关心哪些目录或文件比较大,看看能否干掉一些了,怎么才能知道呢?以易读 ...
- UVaLive 6697 Homework Evaluation (DP)
题意:给出一个长字符串,再给一个短字符串,进行匹配,如果第i个恰好匹配,则 +8,:如果不匹配,可以给长或短字符串添加-,先后匹配,这样-3, 连续的长字符串添加-,需要减去一个4:也可不给添加-,则 ...
- LPTSTR、LPCSTR、LPCTSTR、LPSTR的来源及意义
UNICODE:它是用两个字节表示一个字符的方法.比如字符'A'在ASCII下面是一个字符,可'A'在UNICODE下面是两个字符,高字符用0填充,而且汉字'程'在ASCII下面是两个字节,而在UNI ...
- Arrays, Hashtables and Dictionaries
Original article Built-in arrays Javascript Arrays(Javascript only) ArrayLists Hashtables Generic Li ...
- HTML5 ajax上传附件
var fd = new FormData(); fd.append('/*键值*/', this.files[0]);var xhr = new XMLHttpRequest ...
- Javascript(JS)对Cookie的读取、删除、写入操作帮助方法
var CookieUtils = { get: function (name) { var cookieName = encodeURIComponent(name) + '=', cookieSt ...
- Flex随笔
-keep-generated-actionscript=true 默认的情况在flex中 对label进行字体加粗的时候,只能对英文的字体加粗,而中文的就不可以加粗: 为了能够使中文能够加粗,需要将 ...