.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 ...
随机推荐
- 北信源VRVEIS网管软件测试
650) this.width=650;" border="0" alt="" src="http://img1.51cto.com/att ...
- 导出Excel Gridview
/// <summary> /// 定义导出Excel的函数 /// </summary> /// <param name="FileType ...
- jxse2.6在jdk8下,JxtaMulticastSocket存在的问题
JxtaMulticastSocket覆写了java.net.MulticastSocket的bind方法: @Override public void bind(SocketAddress addr ...
- http://blogs.msdn.com/b/pranavwagh/archive/2007/03/03/word-2007-file-seems-to-be-deleted-when-you-open-and-save-it-using-dsoframer.aspx
http://blogs.msdn.com/b/pranavwagh/archive/2007/03/03/word-2007-file-seems-to-be-deleted-when-you-op ...
- WEB数据挖掘(十六)——Aperture数据抽取(9):数据源
One of the central concepts of Aperture is the notion of a DataSource. A DataSource contains all inf ...
- 编译ffmpeg(iOS)
一,x264库的编译 首先到http://www.videolan.org/developers/x264.html下载x264的库,然后解压,修改文件夹名称为x264 二,下载ffmpeg2 ...
- ISO 9141-2 and ISO 14230-2 INITIALIZATION and DATA TRANSFER
http://ecad.tu-sofia.bg/et/2005/pdf/Paper097-P_Dzhelekarski1.pdf INITIALIZATION Prior to any diagnos ...
- 使用jQuery Mobile和Phone Gap开发Android应用程序
经过了一段时间的学习,初步了解了该如何使用jQuery Mobile和 Phone Gap来开发一个Android应用程序,也想把这些东西介绍给大家. 1. 软件准备 要进行android app的开 ...
- 一个jQuery扩展工具包
带有详尽注释的源代码: var jQuery = jQuery || {}; // TODO // ###################################string操作相关函数### ...
- SMARTFORM报表程序设计(2)
在创建并设置好STYLE程序之后,在SMARTFORM页面选择单选框FORM输入报表程序名称(ZS_SFLIGHT),点击CREATE按钮即可进入SMARTFORM BUILDER图形设置界面,SMA ...