0

我有一个程序,我们想在某个时间点进行多线程处理。我们将 CSLA 用于我们的业务规则。在我们程序的一个位置,我们正在迭代一个 BusinessList 对象,并一次对一行数据运行一些完整性检查。当我们将行数增加到大约 10k 行时,运行该过程需要一些时间(大约一分钟)。自然,这听起来像是使用一点 TPL 并使其成为多线程的理想场所。

这些年来我已经完成了大量的多线程工作,所以我理解从单线程代码切换到多线程代码的陷阱。我惊讶地发现代码在 CSLA 例程中被炸毁了。它似乎与 CSLA PropertyInfo 类背后的代码有关。

我们所有的业务对象属性都是这样定义的:

    public static readonly PropertyInfo<string> MyTextProperty = RegisterProperty<string>(c => c.MyText); 
public string MyText { 
get { return GetProperty(MyTextProperty); } 
set { SetProperty(MyTextProperty, value); } 
}

关于多线程和 CSLA,我有什么需要了解的吗?有没有在任何书面文件中找不到的警告(我还没有找到任何东西)。

- 编辑 - -

顺便说一句:我实现多线程的方式是将所有行放入 ConcurrentBag 中,然后生成 5 个左右的任务,这些任务只是从包中抓取对象直到包为空。所以我不认为问题出在我的代码中。

4

1 回答 1

1

正如您所发现的,CSLA.NET 框架不是线程安全的。

为了解决您的特定问题,我会使用Wintellect Power Threading库;AsyncEnumerator/SyncGate组合或单独的ReaderWriterGate

Power Threading 库将允许您将“读取”和“写入”请求排队到共享资源(您的 CSLA.NET 集合)。在某一时刻,只允许单个“写”请求访问共享资源,所有这些都不会阻塞排队的“读”或“写”请求。它非常聪明且超级方便,可以安全地从多个线程访问共享资源。您可以根据需要启动任意数量的线程,Power Threading 库将同步对您的 CSLA.NET 集合的访问。

于 2011-02-28T16:03:19.737 回答