.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 ...
随机推荐
- 第三百二十一天 how can I 坚持
上班第一天,感觉时间过得好慢. 心里好烦,做什么都没心情,感觉没有勇气了,虽然早上说了那么多,但不敢去面对了. 咋整? <猪老三><野子>. 好想去看<美人鱼> 不 ...
- 转】Spark DataFrames入门指南:创建和操作DataFrame
原博文出自于: http://blog.csdn.net/lw_ghy/article/details/51480358 感谢! 一.从csv文件创建DataFrame 本文将介绍如何从csv文件创建 ...
- vs2012 密匙
旗舰版 YKCW6-BPFPF-BT8C9-7DCTH-QXGWC
- install python module
[install python module] 参考:http://docs.python.org/2.7/install/index.html
- Oracle 10进制转36进制
CREATE OR REPLACE FUNCTION IDFMS.func_dec236 (parm IN INT DEFAULT 0) RETURN VARCHAR2IS /* 10进制 ...
- Lotus 迁移到Exchange 2010 之准备使用Transport 同步Lotus 相关信息!
这里我们先来分析下Lotus迁移到Exchange2010 的一些原理,由于存在一定周期的共存时间,因此在共存期间必须来实现相应的同步计划,整个同步计划包含了如下的同步计划:
- [网络]远程访问局域网svn服务器[转]
转至:http://8474832.blog.51cto.com/8464832/1555449 打开路由器访问界面 选择转发规则->端口映射-新建 在弹出的界面中填写相应的端口号了内网ip 填 ...
- AFNetworking上传文件
-(void)upload{ AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; NSD ...
- CloudStack服务引擎配置(cloud-engine-service模块)
"?> <!--CloudStack服务引擎配置--> <beans xmlns="http://www.springframework.org/schem ...
- Ehcache(06)——监听器
http://haohaoxuexi.iteye.com/blog/2119353 监听器 Ehcache中监听器有两种,监听CacheManager的CacheManagerEventListene ...