我有一个程序,我们想在某一点多线程。我们将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需要了解的内容吗?是否有任何书面文件中没有的警告(我还没有发现任何东西)。
- EDIT ---
BTW:我通过将所有行放入ConcurrentBag然后产生5个左右的任务来实现我的多线程的方式,这些任务只是从包中抓取对象直到包空。所以我不认为问题出在我的代码中。答案 0 :(得分:1)
正如您所发现的,CSLA.NET框架不是线程安全的。
要解决您的特定问题,我会使用Wintellect Power Threading库; AsyncEnumerator
/ SyncGate
组合或ReaderWriterGate
本身。
Power Threading库允许您将“读取”和“写入”请求排队到共享资源(您的CSLA.NET集合)。在某个时刻,只允许一个“写入”请求访问共享资源,所有这些请求都不会阻塞排队的“读取”或“写入”请求。它非常聪明,非常方便安全地从多个线程访问共享资源。您可以根据需要调整多个线程,Power Threading库将同步对CSLA.NET集合的访问。