并发处理datareader结果

时间:2015-03-24 11:40:51

标签: c# multithreading datareader

我的目标是在读取Datareader返回的结果时获得更好的性能。请考虑以下示例以更好地理解问题。

我们已经说过从datareader返回的10个结果集。当我们遍历这些记录来填充我们的对象时,所花费的总时间大约是3秒。现在我被问到如何在1秒内完成这些操作。

这可以通过在datareader中同时处理读取操作来实现吗?如果是,我们怎么做呢?

IDataAccessMapper _dataAccessMapper;

var query = new StringBuilder();
query.Append("SELECT * FROM Step01");
query.Append("SELECT * FROM Step02");
query.Append("SELECT * FROM Step03");
......
query.Append("SELECT * FROM Step10");
var selCommand = dbContracts.GetTextCommand(query.ToString());
var dataReader = selCommand.AsReader();
while (dataReader.Read()){
    //Do something
}

var step1Details = new Collection<Step1Details>
if (dataReader.NextResult()){
    _dataAccessMapper.MapRecords<Step1Details>(dataReader, step1Details);
}
var step2Details = new Collection<Step2Details>
if (dataReader.NextResult()){
    _dataAccessMapper.MapRecords<Step2Details>(dataReader, step2Details);
}
....
....
var step10Details = new Collection<Step10Details>
if (dataReader.NextResult()){
    _dataAccessMapper.MapRecords<Step10Details>(dataReader, step10Details);
}
....

1 个答案:

答案 0 :(得分:0)

DataReader不保证是线程安全的,虽然我认为这个问题来自Connection类,它不是线程安全的。你可以做的是运行单独的线程(使用自己的Connection)来执行各个select语句并同时处理数据。这也将确保每个线程使用自己的DataReader。

请注意,可以选择使用SQL Server中的相同Connection执行多线程,称为MARS(多活动记录集)。但我认为这不是一个很好的方法,可以实现你想要达到的目标。