我有一类范围
public class avl_range { public long start { get; set; } public long end { get; set; } }
如果我使用正常的FOR工作原理是完美的,但是必须等待每个命令完成并且每个查询需要8秒钟,所以10个查询需要80秒钟。
FOR
在并行版本中,如果仅打印范围,则效果很好,但如果尝试执行命令,则说明该过程已在进行中。
{“操作已经在进行中。”}
我该如何解决?
var numbers = new List<avl_range>(); using (var conn = new NpgsqlConnection(strConnection)) { conn.Open(); Action<avl_range> forEachLoop = number => //Begin definition of forLoop { // only the console write line works ok Console.WriteLine(number.start + " - " + number.end); using (var cmd = new NpgsqlCommand()) { cmd.Connection = conn; cmd.CommandText = String.Format( "SELECT * FROM avl_db.process_near_link({0}, {1});" , number.start , number.end); // here cause the error. using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine(reader.GetString(0)); } } } }; Parallel.ForEach(numbers, forEachLoop); } );
Npgsql连接不能同时使用-在任何给定时间点只能运行一个命令(换句话说,没有MARS支持)。
打开多个连接以并行执行查询可能绝对有意义。尽管建立新的物理连接非常昂贵,但是连接池非常轻巧,因此重用物理连接的开销很小。不执行此操作的主要原因是,如果您需要在同一事务中进行多个操作。