原文:
lock
临界资源:一次仅允许一个进程使用的共享资源。
临界区:每个进程中访问临界资源的那段代码称为临界区,对于同一个临界资源,可以有多个临界区。
lock关键字可以确保当一个线程位于代码临界区时,另一个线程不会进入临界区。如果其他线程尝试进入锁定的代码,则它将一直等待(即锁定),直到该对象被释放。
lock关键字在块的开始处调用Enter,而在块的结尾处调用Exit。通常,应避免锁定public类型,否则实例将超出代码的控制范围。
Enter指的是Monitor.Enter(获取指定对象上的排他锁),Exit值的是Monitor.Exit(释放指定对象上的排他锁),这里的指定对象代表临界资源。
下面来说说,我在中的代码,程序会将监听目录下面的新图片文件保存到一个字典中。
这里的_fileList就是我们的临界资源。向字典中添加内容,这个是操作系统的监听线程去完成的。
将图片上传到服务器,然后从字段中删除上传过的数据。这个操作是我们自己开启的一个上传线程。
由于SaveFile方法中操作字典的长度,那么问题来了:如果上传的时候,监听线程又向字典中写入数据,就会造成数据的混乱。通过对字典加锁,可以避免对字典的同时操作:
//监听处理:在文件创建或更改时,将 <图片名称,图片地址> 保存到字典中private void WatchProcess(FileSystemEventArgs e){ //进行字典记录更新 lock (_fileList) { _fileList[fileName] = e.FullPath; } }} 图片名称,图片地址>
//上传图片private void SaveFile(){ while (true) { //从Dictionary中移除添,即使保存出错,也删除,防止错误驻留在程序中 lock (_fileList) { foreach (var i in stringKeys) { _fileList.Remove(i); } } }}