C#基础 线程的概念和多线程基本用法及需要注意的问题

前言:线程(Thread)是编程中的一个很重要的概念。 在很多情况下,采用多线程编程,可以提高应用程序响应速度、 提高运行效率、 提升吞吐量。

一,首先了解什么是线程

线程是代码的执行序列或者执行路径。 线程与进程的概念有一些相似,它类似于一个轻
量级的进程:一个操作系统中可以运行多个进程,一个进程内可以运行多个线程。 每个应用
程序至少运行在一个线程上。 当只有一个线程时,称作单线程应用程序,该线程由系统自动
创建,如以下代码所示。

class Program {
static void Main(string[] args) {
SharedResource resource = new SharedResource();
resource.Add("Item3");
Console.WriteLine("Main Thread Ends.");
Console.ReadKey();
	}
} 
public class SharedResource {
public List<string> list = new List<string> { "Item0", "Item1", "Item2" };
public void Add(string item) {
Console.WriteLine("Add " + item);
list.Add(item);
	}
}
二,创建新线程

System.Threading命名空间下的Thread类提供了线程的基本操作。 通过创建一个
Thread对象,并执行它的Start()方法,可以新建并运行一个新的线程。下面的代码模拟了之前的代码执行流程。

class Program {
static void Main(string[] args) {
ThreadStart ts = new ThreadStart(ThreadEntry);
Thread worker = new Thread(ts);
worker.Start();
Console.WriteLine("Main Thread ends.");
Console.ReadKey();
	} 

static void ThreadEntry() {
SharedResource resource = new SharedResource();
resource.Add("Item3");
	}
}

创建Thread对象之后,调用它的Start()方法,将会启动线程。 Start()方法是非阻塞的,
被调用之后会立即返回(Console.ReadKey()方法是一个阻塞方法的例子,在没有用户输入
之前,会一直等待,不会执行后续代码)。

注意事项

调用Start()后,新线程并非“立即”执行,这取决
于操作系统的线程管理策略,只不过这个时间非常短,感觉上好像新线程立即执行了。 因
此,上面代码的执行结果可能为:

Main Thread ends.
Add item3

也可能为:

Add item3
Main Thread ends.

这个时候就得注意:当多线程长时间运行的时候可能会某个线程停留一段时间,这个时候多个线程执行的代码速度差距将会有区别,如果需求是逐条执行或者有一定的顺序的时候需要做好逻辑上的处理。

同时 如果多条线程执行一个方法时,需要保证每个变量都是在可控范围内。
比如以下代码

Model model=new Model();
BLL bll = new BLL();
public  void ThreadEntry()
{
	model.a = xxx;
	model.b = xxx;
	model.c = xxx;
	bll.insert(model);
}

我们在做单线程项目时经常会这样处理,但是在多线程项目中这样很容易导致数据出错,A线程给model赋值了 a=1,b=2,c=3 还没有执行添加操作的时候B线程进入方法给model.a赋值了5,这个时候数据就有问题了,A线程会将错误的数据添加入库。
所以在多线程使用同一方法时需要保证每个变量都是独立开的,代码因做如下改动。

BLL bll = new BLL();
public  void ThreadEntry()
{
Model model=new Model();
	model.a = xxx;
	model.b = xxx;
	model.c = xxx;
	bll.insert(model);
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值