多线程CSLA.NET

时间:2011-02-08 15:27:00

标签: c# multithreading c#-4.0 csla

我有一个程序,我们想在某一点多线程。我们将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个左右的任务来实现我的多线程的方式,这些任务只是从包中抓取对象直到包空。所以我不认为问题出在我的代码中。

1 个答案:

答案 0 :(得分:1)

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

要解决您的特定问题,我会使用Wintellect Power Threading库; AsyncEnumerator / SyncGate组合或ReaderWriterGate本身。

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