这几天在做采集器的时候.涉及到了多线程.也是关于网络蜘蛛的文章或者是正则表达式.以前教师教过我们多线程,.当时自己没动手.这次动手运到到了许多问题.一个就是线程池...等.在多线程操作数据库的时候一个问题纠结了哦.就是多线程的话.他们就是抢占资源来进行数据处理.那么在打开同一个数据库的时候另外一个线程也在用...导致程序执行到一部分的时候就报错了 无法继续执行了.
在网上看到两个办法
1共用一个连接就可以
通用一个数据库连接文件(我没用这个)
2其实一样可以用lock实现,把数据库操作写成一个函数,函数内加lock。c#会安排他们排队
比如
private static object privateObjectLock = new object();
public static xxoo()
{
lock(privateObjectLock)
{
//数据操作语句
}
}
}
你在一个函数里实现数据库操作。然后线程操作数据库都调用他
public void Function()
{
System.Object lockThis = new System.Object();
lock(lockThis)
{
// Access thread-sensitive resources.
}
}
提供给 lock 关键字的参数必须为基于引用类型的对象,该对象用来定义锁的范围。在上例中,锁的范围限定为此函数,因为函数外不存在任何对该对象的引用。严格地说,提供给 lock 的对象只是用来唯一地标识由多个线程共享的资源,所以它可以是任意类实例。然而,实际上,此对象通常表示需要进行线程同步的资源。例如,如果一个容器对象将被多个线程使用,则可以将该容器传递给 lock,而 lock 后面的同步代码块将访问该容器。只要其他线程在访问该容器前先锁定该容器,则对该对象的访问将是安全同步的。
通常,最好避免锁定 public 类型或锁定不受应用程序控制的对象实例。例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同一对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。锁定字符串尤其危险,因为字符串被公共语言运行库 (CLR)“暂留”。这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。因此,最好锁定不会被暂留的私有或受保护成员。某些类提供专门用于锁定的成员。例如,Array 类型提供 SyncRoot。许多集合类型也提供 SyncRoot。