最近在看些c#的代码,发现很多是以前没有接触到了,只能上网查,把比较好的整理下来。
经常碰到同时需要对某个数据进行操作,或者对某个文件进行读写操作,对于这些操作我们以前往往不能很好的进行处理,自从C#语言中引入了lock这个关键字,以上问题就比较容易予以解决了,下面就是一段简单的代码。
public class AccessControl()
{
private static object privateObjectLock = new object();
public static AccessResult()
{
lock(privateObjectLock)
{
//数据操作语句
}
}
}
文章来自学IT网:http://www.xueit.com/html/2009-02/21_712_00.html
在做邮箱接收网关的时候遇到了以下的需求,要求为每一个邮箱开启一个接收线程,从POP3服务器上收取,然后将邮件存放到统一的FTP服务器上,要求邮件按收接顺充从1开始顺充编号。
我实现的方法为,为每个邮箱new出实例,然后分别赋给POP3邮箱地址,用户名,密码等参数。这里涉及到一个编号同步的问题,因为每个接收邮件的线程都是自己执行,所以取得编号并且递增这个动作是互斥的。
以一个静态变量表示编号如下
class EmailInfo
{
public static int CurrentNumber;
}
那在当前线程取得这个步骤为
_CurrentNumber=++EmailInfo.CurrentNumber;
虽然此为一句,但在计算机运行时却分为多步,如下
EmialInfo.CurrentNumber加1--EmailInfo.CurrentNumber返回值给_CurrentNumber
,也许线程1执行了EmailInfo.CurrentNumber加1 的操作,但还没有取得返回值,此时线程2又执行了EmailInfo.CurrentNumber加1的操作,然后又线程1,线程2取得了返回值就是一样的,这样就失去了按顺序递增的作用。
此时查找了网上有关线程同步的方法,其实用lock语句锁住递增的那一段即可。而介绍的相关用法为
lock(this)
{
_CurrentNumber=++EmailInfo.CurrentNumber;
}
本以为这样就可以成功,谁知道还是无效,反复查找才发现没弄清楚lock的用法。因为网上所讲的资料,举的例子比较简单,是直接new 出一个对像,然后为对像的一个函数创建了多个线程运行,所以它的同步只要lock住this即它自己就行了。因为此时只有一个实例在运,而我是new 出了多个对像,lock住每个自己的实例所以当然无效。
所以自然想了一个解决方法,就lock住相同的一个实例就行了。因为我每个邮件接收线程的参数都是不同的,所以还是new出几个实像,但lock的方法改为如下
先为EmailInfo加一个静态变量
class EmailInfo
{
public static object syncRoot = new object();
public static int CurrentNumber;
}
然后lock改为
lock(EmailInfo.syncRoot)
{
_CurrentNumber=++EmailInfo.CurrentNumber;
}
即可实现想要的效果了。
文章来自学IT网:http://www.xueit.com/html/2009-02/21_712_00.html
分享到:
相关推荐
在上述代码中,`AccessResult`方法中的`lock`语句确保了对于`privateObjectLock`对象的访问是互斥的,即在任何时刻,只有一个线程能够执行`data operation statements`。 在邮件接收网关的场景中,我们需要确保邮箱...
标题"**C#多线程读写sqlite**"涉及的主要知识点包括: 1. **多线程编程**:C#中的`System.Threading`命名空间提供了丰富的类和方法来创建和管理线程,如`Thread`类、`Task`类以及`ThreadPool`。通过多线程,程序...
在实际的多线程应用中,除了`lock`,还可以使用`Monitor`、`Mutex`、`Semaphore`等其他同步机制来实现互斥和资源限制。例如,`Mutex`允许跨进程的互斥访问,而`Semaphore`则可以控制同时访问资源的线程数量。 测试...
一、C#多线程基础 C#中的多线程主要依赖于System.Threading命名空间,其中Thread类是线程的基本实现。创建一个新的线程可以使用Thread类的构造函数,传入一个委托作为线程启动时要执行的方法。例如: ```csharp ...
4. 使用CopyTo()方法:如果只需要读取List,可以先将List复制到一个新的数组,然后在多线程环境中操作这个数组,避免直接操作List。 5. 使用线程池:对于大量并发的短任务,使用ThreadPool可以有效减少线程创建和...
《C#多线程编程实战(原书第二版)源码》是一本深入探讨C#中多线程技术的专业书籍,其源码提供了丰富的实践示例,帮助读者掌握并发编程的核心概念和技术。在C#中,多线程是实现高性能、响应式应用程序的关键组成部分...
本实例将详细讲解如何在多线程中使用C#的Queue类。 首先,我们创建一个队列实例,通过`new Queue()`来指定存储的数据类型。在本例中,队列存储的是字符串类型(string),所以是`Queue<string>`。接着,我们填充...
本文实例讲述了C#中volatile与lock用法,分享给大家供大家参考。具体分析如下: 一、C#中volatile volatile是C#中用于控制同步的关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问...
"10.3_C#多线程监视器程序"可能是一个示例项目,旨在教授如何在C#环境中管理和监控多个并发线程。让我们深入探讨一下这个主题,了解多线程的核心概念以及在C#中如何使用它们。 首先,多线程允许一个应用程序同时...
在这个“C#多线程编程源码”中,我们可以深入学习如何在Visual Studio 2008环境下利用C#进行多线程操作,包括UI线程和异步调用的实现。 1. **多线程基础** - **线程创建**:C#中可以使用`System.Threading.Thread`...
在C#编程语言中,多线程是一种强大的技术,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应性。多线程是现代计算环境中不可或缺的一部分,尤其是在处理大量数据、进行复杂计算或者需要实现并发操作的...
在C#编程中,线程安全是多线程应用程序中至关重要的一个方面,尤其是在处理共享资源如文本日志文件时。本主题将深入探讨如何在C#中创建一个高效的线程安全日志类,用于在多线程环境中安全地写入txt日志。 首先,...
二、C#多线程在上位机中的应用 2.1 数据采集与处理:在上位机中,多线程可以用于并行处理数据采集和数据分析,避免因单一线程阻塞而导致的延迟。 2.2 UI更新与后台处理:通过创建后台线程执行耗时操作,主线程(UI...
在"C#多线程学习.doc"文档中,可能涵盖了线程的基本用法,如`System.Threading.Thread`类的使用,创建和启动线程的方法,以及如何控制线程的生命周期(如Join、Abort和Suspend等)。 其次,"thread.pdf"可能详细...
在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以充分利用现代多核处理器的优势,实现并行处理和高效能编程。本资源包含六个C#.NET多线程的实例,涵盖了多线程的基本使用到更高级的概念,如线程互斥。...
### C#多线程技术 #### 创建和启动线程 在C#中,创建一个线程最简单的方法是通过`Thread`类。首先,需要定义一个线程委托,这个委托将作为线程的入口点。例如: ```csharp Thread trd1 = new Thread(new Thread...
C#多线程是.NET框架中的一个重要特性,它允许开发者在同一时间内执行多个任务,从而提高应用程序的效率和响应性。在处理大量数据、实现并发操作或进行后台处理时,多线程技术尤其有用。本参考手册将深入探讨C#中的多...
在编程领域,多线程是实现并发执行任务的关键技术,特别是在C#这样的语言中,它提供了丰富的多线程支持。本文将深入探讨C#中的多线程实例,以帮助开发者理解如何有效地利用多核处理器资源,提高程序的执行效率。 多...
在C#编程中,多线程是一个至关重要的概念,尤其对于开发高性能、高...通过阅读提供的“C#多线程开发之并发编程经典实例.pdf”,你将能够深入了解这些概念,并学会如何在实际项目中应用它们,提升你的C#多线程编程能力。
本文将基于“C#多线程系列教程”这一主题,深入探讨多线程的基本概念、原理以及在C#中的具体应用,旨在为初学者、开发人员以及对多线程技术感兴趣的程序员提供全面、系统的知识体系。 ### C#多线程基础 #### 1. 多...