使用BeginInvoke进行多线程处理时如何锁定资源?

时间:2012-01-12 14:54:55

标签: c# multithreading parsing

我有一种方法可以解析属于某个用户的某些数据并将其保存到数据库中。

delegate void parseUserDataDelegate(string pathToFile);

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

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

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

1 个答案:

答案 0 :(得分:0)

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

lock(NewUserSync)
{
  FooBar();
}

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