2012-01-12 67 views
0

我有一种方法解析属于某个用户的一些数据并将其保存到数据库。如何在使用BeginInvoke进行多线程时锁定资源?

delegate void parseUserDataDelegate(string pathToFile); 

我为它创建了一个委托并使用BeginInvoke进行呈现以进行并行处理。

parseUserDataDelegate deleg = new parseUserData(this.parseUserData); 
IAsyncResult result = deleg.BeginInvoke(path, null, null); 
deleg.EndInvoke(result); 

问题是有两个表 - 一个用于外键是用户ID和另一个用户表的数据。当解析时没有相应的用户时,该方法向用户表中添加一个新条目并使用其ID。一个用户的数据表中大约有100个条目。问题是,当处理第一个用户的所有数据时,会出现错误,因为两个线程尝试为第二个用户创建相同的条目。如何锁定不同线程的用户表访问权限?

+0

如果您立即调用BeginInvoke并紧接着EndInvoke,则不会有并行处理。调用EndInvoke的线程将等待操作完成。 – 2012-01-12 15:01:52

+0

我建议你在做任何事务之前先检查新用户。插入它们,然后只在第二张桌子上工作......除非我错过了一些你的逻辑 – Boomer 2012-01-12 15:03:38

回答

0

取决于你的代码。我会建议寻找用户的方法和可选地创建新用户的地方放在锁定块中。

lock(NewUserSync) 
{ 
    FooBar(); 
} 

其中NewUserSync是这些工作线程之间共享的普通对象。如果解析代码在类中,则它在ctor中创建(在多线程上启动该方法之前)。用户ID当然可以缓存在某个共享对象中(需要线程安全性)。