C# C线程安全类和列表
当前需要从SQL数据库中提取许多记录,然后将这些记录以更小的块提交给API调用。根据另一个进程加载了多少数据,从SQL中提取的数据量是不一致的,有时数据量小到只需要一个工作进程即可处理。当数据拉取较大(最大5k行)时,需要更多线程来帮助查询API以获得速度。这个过程非常有效,但当我一次运行一个时,它在大容量下运行缓慢。然而,我发现我传递给类的列表随着多个线程的启动而改变。如何实现线程安全 我已经读过这方面的内容,并尝试了很多——比如锁和ConcurrentBag,但我不太确定应该在哪里应用,或者如何使用它们来实现我想要的目标 以下是我所拥有的:C# C线程安全类和列表,c#,C#,当前需要从SQL数据库中提取许多记录,然后将这些记录以更小的块提交给API调用。根据另一个进程加载了多少数据,从SQL中提取的数据量是不一致的,有时数据量小到只需要一个工作进程即可处理。当数据拉取较大(最大5k行)时,需要更多线程来帮助查询API以获得速度。这个过程非常有效,但当我一次运行一个时,它在大容量下运行缓慢。然而,我发现我传递给类的列表随着多个线程的启动而改变。如何实现线程安全 我已经读过这方面的内容,并尝试了很多——比如锁和ConcurrentBag,但我不太确定应该在哪里应用,或者
class Start
{
public void Execute()
{
SQLSupport sqlSupport = new SQLSupport();
List<SQLDataList> sqlDataList = new List<SQLDataList>();
List<SQLDataList> sqlAPIList = new List<SQLDataList>();
sqlDataList = sqlSupport.sqlQueryReturnList<sqlDataList>("SELECT * FROM TABLE");
if (sqlDataList.Count > 200)
{
int iRow = 0;
int iRowSQLCount = 0;
foreach (var item in sqlDataList)
{
if (iRowSQLCount == 100)
{
APIProcess apiProcess= new APIProcess (sqlAPIList);
Thread thr = new Thread(new ThreadStart(apiProcess.Execute));
thr.Start();
sqlAPIList.Clear();
iRowSQLCount = 0;
}
sqlAPIList.Add(sqlDataList[iRow]);
iRowSQLCount++;
iRow++;
}
}
}
}
class APIProcess
{
List<SQLDataList> sqlAPIList= new List<SQLDataList>();
public APIProcess(List<SQLDataList> sqlList)
{
sqlAPIList = sqlList;
}
public void Execute()
{
foreach (var item in sqlAPIList)
{
//loop through the list, interact with the API, update the list and ultimately update SQL with the API data.
}
}
您可以将BlockingCollection与单个消费者和多个生产者一起使用通过链接可以找到的一些示例您可以将BlockingCollection与单个消费者和多个生产者一起使用通过链接可以找到的一些示例